#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 2 3 4 5 2 4 6 2 6 8 7 9 7 1 6 2 4 */
并查集
最新推荐文章于 2019-07-08 18:26:50 发布