【解题报告】【HDOJ1232】【并查集】畅通工程

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 int father[1005];
 4 int record[1005];
 5 int find(int x)//用来寻找根节点
 6 {
 7     int t;
 8     if(father[x]==x)
 9         return x;
10     t=find(father[x]);
11     father[x]=t;
12     return t;
13 }
14 int main()
15 {
16     int n,m,i,fx,fy,a,b,sum;
17     //freopen("1.txt","r",stdin);
18     while(scanf("%d",&n)!=EOF&&n)
19     {
20         scanf("%d",&m);
21         for(i=1;i<=n;i++)//初始化
22         {
23             father[i]=i;//记录父节点
24             record[i]=0;
25         }
26         for(i=0;i<m;i++)//读取、构造子树、合并
27         {
28             scanf("%d%d",&a,&b);
29             fx=find(a);
30             fy=find(b);
31             father[fx]=fy;
32         } 
33         for(i=1;i<=n;i++)
34         {
35             father[i]=find(father[i]);//压缩路径
36             record[father[i]]=1;//记录不同树的数量
37         }
38         sum=0;
39         for(i=1;i<=n;i++)//统计树数
40         {
41             if(record[i]) 
42                 sum++;
43         }
44         printf("%d\n",sum-1);//n棵树要n-1条边连接
45     }
46     return 0;
47 }

 

posted on 2012-07-21 16:40  coding封神  阅读(123)  评论(0编辑  收藏  举报

导航