The Necklace
UVA - 10054题意:每个珠子有两个颜色,给n个珠子,问能不能连成一个项链,使得项链相邻的珠子颜色相同。
把颜色看做点,珠子内部连一条边,无向图求欧拉回路。
这里我用的并查集。
输出路径就dfs就行了
1 #include <bits/stdc++.h> 2 using namespace std; 3 int g[55][55]; 4 int f[55]; 5 int deg[55]; 6 int n; 7 8 int gf(int x) 9 { 10 return x==f[x]?x:f[x]=gf(f[x]); 11 } 12 13 void dfs(int u) 14 { 15 for(int i=1;i<=50;i++) if(g[u][i]) 16 { 17 g[u][i]--; 18 g[i][u]--; 19 dfs(i); 20 printf("%d %d ",i,u); 21 } 22 } 23 int main() 24 { 25 int t; 26 int kase=0; 27 scanf("%d",&t); 28 while(t--) 29 { 30 for(int i=0;i<=55;i++) f[i]=i; 31 memset(deg,0,sizeof(deg)); 32 memset(g,0,sizeof(g)); 33 scanf("%d",&n); 34 int u,v; 35 for(int i=0;i<n;i++) 36 { 37 scanf("%d%d",&u,&v); 38 g[u][v]++; 39 g[v][u]++; 40 deg[u]++; 41 deg[v]++; 42 int pu=gf(u); 43 int pv=gf(v); 44 if(pu!=pv) f[pu]=pv; 45 } 46 if(kase) puts(""); 47 printf("Case #%d ",++kase); 48 int rt=0; 49 int flag=1; 50 for(int i=1;i<=50;i++) if(deg[i]) 51 { 52 if(deg[i]&1) { 53 flag=0; 54 break; 55 } 56 if(rt==0) rt=gf(i); 57 else{ 58 int v=gf(i); 59 if(v!=rt) { 60 flag=0; 61 break; 62 } 63 } 64 } 65 if(flag) 66 { 67 dfs(rt); 68 } 69 else puts("some beads may be lost"); 70 } 71 }