并查集,dfs

ぃ、小莉子 提交于 2019-12-02 16:48:22
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int edge[55][55],d[55];
 7 
 8 void dfs(int mid) //寻找连通块
 9 {
10 for(int k=1;k<=50;k++)
11 {
12 if(edge[mid][k])
13 {
14 edge[mid][k]--;
15 edge[k][mid]--;
16 dfs(k);
17 printf("%d %d\n",k,mid); //一定要逆序输出,这样得到的才是答案
18 }
19 }
20 return;
21 }
22 int main(void)
23 {
24 int t,n,t0,i,j,x,y;
25 scanf("%d",&t);
26 for(t0=1;t0<=t;t0++)
27 {
28 memset(edge,0,sizeof(edge));
29 memset(d,0,sizeof(d));
30 scanf("%d",&n);
31 for(i=0;i<n;i++)
32 {
33 scanf("%d%d",&x,&y);
34 edge[x][y]++;
35 edge[y][x]++;
36 d[x]++;
37 d[y]++;
38 }
39 printf("Case #%d\n",t0);
40 
41 for(i=1;i<=50;i++)
42 {
43 if(d[i]%2)
44 break;
45 }
46 if(i<=50)
47 printf("some beads may be lost\n");
48 else
49 {
50 for(j=1;j<=50;j++)
51 dfs(j);
52 }
53 if(t0!=t)
54 printf("\n");
55 }
56 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!