1. 程式人生 > >The Necklace UVA - 10054 (無向圖的歐拉回路)

The Necklace UVA - 10054 (無向圖的歐拉回路)

n) 兩個 logs nec get dfs lap none view

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\n",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\n",++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 }
View Code

The Necklace UVA - 10054 (無向圖的歐拉回路)