題目:https://www.luogu.org/problemnew/show/P1341ios
題意:給定n對字母對,要求構造一個個數爲n+1的字符串,使得每個字母對都在裏面出現過。spa
思路:這種題目都卡了很久,代碼能力真的不行了啊。code
其實就是每一個字母是節點,每一個字母對就是這兩個字母之間連一條邊,每一個字母對都要出現就是每條邊都要通過一次且只通過一次。blog
因此就是一個歐拉路的問題。ci
歐拉路問題很簡單,首先若是度數是奇數的點只能是0或2個。字符串
以後就是遍歷節點的每一條邊,所有dfs結束了以後把這個節點加入棧中就好了。get
1 #include<cstdio> 2 #include<cstdlib> 3 #include<map> 4 #include<set> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<cmath> 9 #include<stack> 10 #include<queue> 11 #include<iostream> 12 13 #define inf 0x7fffffff 14 using namespace std; 15 typedef long long LL; 16 typedef pair<int, int> pr; 17 18 int n; 19 const int maxm = 3000; 20 const int maxn = 300; 21 int g[maxn][maxn]; 22 //int head[maxn], to[maxm * 2], nxt[maxm * 2], vis[maxm * 2]; 23 int deg[maxn]; 24 int tot = 1; 25 26 stack<int>ans; 27 28 void dfs(int now){ 29 30 for(int i = 0; i <= 150; i++){ 31 if(g[now][i] <= 0)continue; 32 g[now][i]--;g[i][now]--; 33 dfs(i); 34 } 35 ans.push(now); 36 //printf("%c", now); 37 } 38 39 int main() 40 { 41 scanf("%d", &n); 42 for(int i = 0; i < n; i++){ 43 string s; 44 cin>>s; 45 g[s[0]][s[1]]++;g[s[1]][s[0]]++; 46 //cout<<s[0]-'A'<<" "<<s[1]-'A'<<endl; 47 deg[s[0]]++; 48 deg[s[1]]++; 49 //add(s[0] - 'A', s[1] - 'A'); 50 } 51 52 //printf("%d\n", deg['I' - 'A']); 53 int cnt = 0, dian = 0; 54 for(int i = 0; i <= 150; i++){ 55 if(deg[i] % 2){ 56 cnt++; 57 if(!dian)dian = i; 58 } 59 } 60 if(!cnt){ 61 for(int i = 0; i <= 150; i++){ 62 if(deg[i]){ 63 dian = i; 64 break; 65 } 66 } 67 } 68 69 if(cnt && cnt != 2){ 70 printf("No Solution\n"); 71 } 72 else{ 73 dfs(dian); 74 //cout<<ans.size()<<endl; 75 if(ans.size() >= n+1){ 76 while(!ans.empty()){ 77 printf("%c", ans.top()); 78 ans.pop(); 79 } 80 printf("\n"); 81 } 82 else{ 83 printf("No Solution\n"); 84 } 85 } 86 87 }