首页 > 其他 > 详细

hdu 1213

时间:2015-08-14 13:37:04      阅读:186      评论:0      收藏:0      [点我收藏+]

题目大意,宴会上每个人都想跟自己认识的人坐一块,现在告诉你哪两个人互相认识,假设1认识2,2认识3则有1认识3,1,2,3可以坐一块,即找到连通分支数即可

 1 #include<stdio.h>
 2 int f[10005],n,m;
 3 
 4 //初始化 
 5 void init()
 6 {
 7     for(int i=1;i<=n;i++)
 8         f[i]=i;
 9 } 
10 //递归函数,不停的去找爹,直到找到祖宗为止 
11 int getf(int v)
12 {
13     if(v == f[v])
14         return v;
15     //路径压缩,函数返回时改变了爹的值,有利于后面找祖宗 
16     else
17     {
18         f[v]=getf(f[v]);
19         return f[v];
20     }
21 }
22 
23 //合并两个子集的函数 
24 void merge(int u,int v)
25 {
26     int t1=getf(u);
27     int t2=getf(v);
28     //判断两个结点是不是在同一个集合中 即是不是共祖宗 
29     if(t1 != t2)
30     {
31         f[t2]=t1;
32         //靠左原则,将右边集合变成左边的子集合
33         //经过路径压缩后将f[u]的根的值也赋值为v的祖先f[t1] 
34     }
35 }
36 
37 int main()
38 {
39     int x,y,sum,num;
40     while(scanf("%d",&num)!=EOF)
41     {
42         while(num--)
43         {
44             scanf("%d %d",&n,&m);
45             {
46                 sum=0;
47                 //初始化 
48                 init();
49                 
50                 for(int i=1;i<=m;i++)
51                 {
52                     //开始合并 
53                     scanf("%d %d",&x,&y);
54                     merge(x,y);
55                 }
56                 
57                 //扫描连通分支数 
58                 for(int i=1;i<=n;i++)
59                 {
60                     if(f[i] == i)
61                     sum++;
62                 }
63                 printf("%d\n",sum);
64             }
65         }
66     }
67     return 0;
68 }

 

hdu 1213

原文:http://www.cnblogs.com/lmqpt/p/4729377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!