并查集

来源:互联网 发布:留存统计最高效的算法 编辑:程序博客网 时间:2024/06/06 14:27
#include<stdio.h>int f[1000]={0},n,m,k,sum=0;void init(){int i;for(i=1;i<=n;i++)f[i]=i;      //开始每个强盗的头都是自己 return;}int getf(int v){if(f[v]==v)   //判断强盗的头是不是自己 return v;else{ f[v]=getf(f[v]);//如果这个强盗的头是其他人让这个人进入递归 return f[v];//这个强盗和两个人有关系,让第一个头成为第二个头的小弟}}void merge(int v,int u)//读入两个强盗的关系 {int t1,t2;t1=getf(v);t2=getf(u);if(t1!=t2)  //如果u的头不是v,让v成为u的头 {f[t2]=t1;}return;}int main(){int i,x,y;scanf("%d %d",&n,&m);init();for(i=1;i<=m;i++){scanf("%d%d",&x,&y);merge(x,y);}for(i=1;i<=n;i++){if(f[i]==i)sum++;}printf("\n\n");for(i=1;i<=n;i++){printf("%d %d\n",i,f[i]);}printf("%d\n",sum);getchar();return 0;}/*10个强盗9种关系,问属于多少个犯罪集团10 9 1 23 45 24 62 68 79 71 62 4*/