链接:点击打开链接
题意:给出一个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;
}