HDU 1232 畅通工程(求集合个数)

来源:互联网 发布:java中九九乘法表原理 编辑:程序博客网 时间:2024/06/05 16:08

题目地址:点击打开链接

思路:并查集模板

AC代码:

#include<stdio.h>int pre[1000];int find(int x){int r=x,i=x,j;while(pre[r]!=r){r=pre[r];}while(pre[i]!=r)// 四弟告诉三弟咱的老大是谁,然后三弟告诉二弟咱的老大是谁,二弟的老大就是老大就不用告诉了,这是路径压缩{j=pre[i];pre[i]=r;i=j;}return r;}int join(int x,int y){if(find(x)!=find(y))pre[find(y)]=find(x);return 0;}int main(){int n,m,i,x,y,sum;while(scanf("%d%d",&n,&m)&&n){sum=0;for(i=1;i<=n;i++){pre[i]=i;}for(i=0;i<m;i++){scanf("%d%d",&x,&y);join(x,y);}for(i=1;i<=n;i++){if(pre[i]==i)sum++;}printf("%d\n",sum-1);}return 0;}用递归方法求自己的老大也可以int find(int x){int r;r = x;if(pre[r] == r)return r;return(find(pre[r]));}

这个find更简洁

int find(int x){    return x == pre[x] ? x : pre[x] = find(pre[x]);//找老大加路径压缩}



0 0