题意
n个学生,分m组,一组中一人有嫌疑则全组都有嫌疑
规定学生0有嫌疑
找出多少人有嫌疑
思路
用并查集把同一个组的人连接起来
查找和f[0]相同的共有多少人即可
代码
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 30010
int f[N],a[N];
int n,m,k;
int getf(int v)
{
if(f[v]==v) return v;
return f[v]=getf(f[v]);
}
void merge(int x,int y)
{
int t1=getf(x);
int t2=getf(y);
if(t1!=t2)
f[t2]=t1;
return;
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n+m)){
for(int i=0;i<n;i++)
f[i]=i;
for(int i=1;i<=m;i++){
scanf("%d",&k);
scanf("%d",&a[1]);
for(int j=2;j<=k;j++){
scanf("%d",&a[j]);
merge(a[j-1],a[j]); //每人与其前一个人连接起来
}
}
for(int i=0;i<n;i++)
f[i]=getf(f[i]); //更新所有人信息
int ans=0;
for(int i=0;i<n;i++)
if(f[i]==f[0]) ans++;
printf("%d\n",ans);
}
return 0;
}