问题的的大意是:0号是感染者,凡是和感染者在同一个社团的都是感染者,让你计算一共有多少个感染者
我们可以在输入的同时,将同一个社团的标记为同一组,最后只要找到0哪一组的人数就ok了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX_N 30005
int par[MAX_N];
int total[MAX_N];
//完成初始化
void init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
total[i]=1;
}
}
//查找元素的根
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);//路径压缩,对于每个节点,一旦向上走到了一次根节点,就把这个店到父亲的边改为直接连向边
}
void unite(int a,int b)
{
int p1=find(a);
int p2=find(b);
if(p1==p2)
return ;
total[p1] +=total[p2];
par[p2]=p1;
}
int n,m;
int main()
{
while(scanf("%d %d",&n,&m))
{
if(m==n&&n==0)
break;
init(n);
for(int i=0;i<m;i++)
{
int k,first,s;
scanf("%d %d",&k,&first);
for(int j=1;j<k;j++)
{
scanf("%d",&s);
unite(first,s);
}
}
printf("%d\n",total[find(0)]);
}
return 0;
}