題目:這裏php
題意:有一種由彩色珠子鏈接而成的項鍊,每一個珠子兩半由不一樣顏色(由1到50的數字表示顏色)組成,相鄰的兩個珠子在接觸的地方顏色相同,如今有一些零碎的珠子,確認它是否能ios
復原成完整的項鍊。spa
把每種顏色當作一個結點,每一個珠子的兩半連成一條有向邊,就成了判斷一個歐拉回路了,而輸出迴路路線能夠用dfs,逆序輸出,由於順序輸出的時候,因爲可能會有一個結點上多code
條邊的狀況,dfs的時候可能一開始會找到錯誤的路線再回溯回去,順序輸出就把這段錯誤的路線也輸出了。blog
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int M = 1e3 + 10; 9 int cas,head[M*4],father[60],du[60]; 10 int vis[60][60]; 11 12 struct Edge{ 13 int next,to; 14 }edge[M*4]; 15 16 int findest(int x) 17 { 18 if (x==father[x]) return x; 19 father[x]=findest(father[x]); 20 return father[x]; 21 } 22 23 void add(int v,int u) 24 { 25 edge[++cas].next=head[v]; 26 edge[cas].to=u; 27 head[v]=cas; 28 } 29 30 void euler(int u) 31 { 32 for (int i=head[u] ; i ; i=edge[i].next){ 33 int v=edge[i].to; 34 if (!vis[u][v]) continue; 35 vis[u][v]--;vis[v][u]--; 36 euler(edge[i].to); 37 printf("%d %d\n",v,u); 38 } 39 } 40 41 int main() 42 { 43 int t,tem=0; 44 scanf("%d",&t); 45 int e=t; 46 while (t--) 47 { 48 int n,w;cas=0; 49 scanf("%d",&n); 50 memset(du,0,sizeof(du)); 51 memset(vis,0,sizeof(vis)); 52 memset(head,0,sizeof(head)); 53 for (int i=1 ; i<=50 ; i++) father[i]=i; 54 for (int i=1 ; i<=n ; i++) { 55 int l,r; 56 scanf("%d%d",&l,&r); 57 if (i==1) w=l; 58 du[l]++;du[r]++; 59 add(l,r); 60 add(r,l); 61 vis[l][r]++;vis[r][l]++; 62 int x=findest(l),y=findest(r); 63 if (x!=y) father[x]=y; 64 } 65 bool flag=false; 66 int x=findest(w); 67 for (int i=1 ; i<=50 ; i++){ 68 if (du[i]==0) continue; 69 if (du[i]%2!=0) flag=true; 70 if (findest(i)!=x) flag=true; 71 if (flag) break; 72 } 73 cas=0; 74 if (tem!=0) printf("\n"); 75 printf("Case #%d\n",++tem); 76 if (flag) puts("some beads may be lost"); 77 else euler(w); 78 } 79 return 0; 80 }