码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1213

时间:2015-08-14 13:38:37      阅读:96      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!