思路:給2n個點,取出其中n+1個點,判斷能不能組成乙個符合題意的字串。
可以比擬圖,n + 1個點有n條邊,然後他們又是一條路上的點。
可以比擬尤拉圖,如果可以構成環,就是說每個點的度都是偶數,
即從任意點出發都能回到該點,就是尤拉閉跡,即尤拉迴路。
如果不能構成環,有兩個點的度是奇數,其他點的度數都是偶數,說明
可以組成一條尤拉開跡,就是尤拉迴路拆去了某條邊,讓環無法形成。
那題目就簡單了,這裡有乙個注意點,也算乙個坑吧,就是輸出路線時,
如果你是邊輸出邊遍歷點的話會出現一種情況:
ax xy yz za zz
輸出答案: axyzaz
實際答案: axyzza
為什麼呢,第乙個答案很容易想到,第二個呢?
注意:我們在存答案時,我們總是 str[++l] = ic[now](**裡有),那麼什麼時候才會寫下第乙個答案呢?
顯然,當乙個分支到底了,寫下答案並層層回歸。那麼我們就不難想出第二種答案了,
當z因為貪心遍歷到a,而a沒有與其他點相鄰,那麼a就是第乙個寫下的答案了,如果還有與a相鄰的點,
那麼一定會進入另乙個分支。
補:當然需要判是否連通,但這個題不判也可以過,資料有點水。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9using
namespace
std;
1011 typedef long
long
ll;12
#define inf (1ll << 25)
13#define rep(i,j,k) for(int i = (j); i <= (k); i++)
14#define rep__(i,j,k) for(int i = (j); i < (k); i++)
15#define per(i,j,k) for(int i = (j); i >= (k); i--)
16#define per__(i,j,k) for(int i = (j); i > (k); i--)
1718
const
int n = 60;19
inttot[n];
20bool
21int
fa[n];
22 mapic;
23 mapci;
24int
g[n][n];
25char str[10010
];26
intl;
2728
int find_root(int
x)31
32void merge(int x,int
y)37
38void dfs(int
now)
45 str[++l] =ic[now];46}
4748
intmain()
61 rep(i,26,51)65
66//
rep(i,1,52) cout << ic[i] << " ";
67//
cout << endl;
6869
intn;
70 cin >>n;
71char
a,b;
72 rep(i,1
,n)83
84int odd = 0; //
奇數度85
int even = 0; //
偶數度86 rep(i,1,52) if
87if(tot[i] & 1) odd++;
88else even++;89}
9091
//判連通
92int t = 0
;94 t++;
95if(t == 2) break;96
}9798//
不連通99
if(t == 2) cout << "
no solution
"<100else
if(odd == 2)
105106 per(i,l,1) cout <107 cout <108}
109else
if(odd == 0)
114 per(i,l,1) cout <115 cout <116}
117else cout << "
no solution
"<118119
120getchar(); getchar();
121return0;
122 }
洛谷 P1341 無序字母對
這道題第一眼以為是一道字串的題,但細想一下是一道求尤拉路的圖論題。把每一對對應關係看成一條邊,本題即求這張圖上是否存在乙個尤拉迴路或尤拉路,並要求字典序最小的方案,那麼我們在dfs的時候就要從該點所連的最小的點開始便利,並將所得的結果存在乙個陣列中,最後逆序輸出。include include in...
洛谷P1341 無序字母對
給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串 現。不同的無序字母對個數有限,n的規模可以通過計算得到。各不相同的無序字母對總數有限,有52 51 2 1326種,這是n的規模。此題的建模是圖論,給出的無序字母...
洛谷P1341 無序字母對
題目鏈結 根據題意,只有在每兩個相鄰的字母都構成乙個要求的無序字母對時,才能滿足要求,我們不妨將每個字母看成乙個節點,每個無序字母對看成乙個無向邊,我們要從乙個點出發,不重複地走完所有的邊,所走的路徑上的點構成的字串即為乙個合法的解 這就轉化成了求一條字典序最小的尤拉路徑 字典序就用堆搞一下就行了 ...