【解题报告】【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 }