标签:
链接:点击打开链接
题意:给出一个n和m,n为人数,编号为0~n-1,有m个团体,团体中的人相互认识,为与编号为0认识的人有多少
代码:
#include <iostream> #include<stdio.h> #include<algorithm> #include <stdio.h> #include <string.h> using namespace std; int f[50005],temp[50005]; int found(int x){ //找到根节点 if(f[x]!=x) f[x]=found(f[x]); return f[x]; } int main(){ int m,n,k,i,j,sum,minn; while(scanf("%d%d",&m,&n)!=EOF&&(m||n)){ for(i=0;i<m;i++) f[i]=i; int cur=0; for(i=1;i<=n;i++){ scanf("%d",&k); for(j=0;j<k;j++){ scanf("%d",&temp[j]); if(j!=0) f[found(temp[j])]=f[found(temp[j-1])]; //使根节点连在一起,但并没有更新子节点的根节点 } } for(i=0;i<m;i++) temp[i]=found(i); //因此在这步将根节点找到并储存起来 sum=0; for(i=0;i<m;i++) if(temp[i]==temp[0]) //跟编号我0共用一个根节点也就是一个集合中的为 sum++; //患病人数 cout<<sum<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47393899