HDU-1232 畅通工程(并查集)

来源:互联网 发布:查看网络延时命令 编辑:程序博客网 时间:2024/06/04 19:06


#include <stdio.h>#include <string.h>#define max_N 1000int par[max_N];int rank[max_N];void init(int n)//初始化par {for(int i=1;i<=n;i++){par[i]=i;rank[i]=0;}}int find(int x)//查找x的根节点 {while(x!=par[x]) {x=par[x];}return x;}void unite(int x,int y){x=find(x);//x的根节点 y=find(y);//y的根节点 if(x==y)return;if(rank[x]<rank[y])//将深度大的树的根节点作为深度小的根节点 {par[x]=y;}else{par[y]=x;if(rank[x]==rank[y])//如果两棵树的深度相同  各相加一 rank[x]++;}}int main(){int N,M;while(scanf("%d",&N)&&N&&scanf("%d",&M)){int sum=0;init(N);int a,b;for(int i=0;i<M;i++){scanf("%d%d",&a,&b);unite(a,b);}for(int i=1;i<=N;i++){ if(par[i]==i)//通过判断根节点数目来判断各集合数目 {sum++;}}printf("%d\n",sum-1);}return 0;}


0 0