The Necklace UVA - 10054 (无向图的欧拉回路)

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

 

posted @ 2017-08-26 13:29  yijiull  阅读(142)  评论(0编辑  收藏  举报