题目大意:0号学生是流感疑似病人,找出与0接触及与0间接接触的人(与0接触的人接触的人)的个数
解决:并查集,找出与0同在一个集合的所有元素的个数
#include <iostream>
#include <cstring>
using namespace std;
int num[30005];
bool mark[30005];
int find(int x)
{
if(num[x]<0)return x;
return num[x]=find(num[x]);
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)return;
int t=num[fa]+num[fb];
if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
else {num[fb]=fa;num[fa]=t;}
}
int main()
{
int n,m;
while(cin>>n>>m,n)
{
memset(num,-1,sizeof(num));
memset(mark,false,sizeof(mark));
int k,t,a;
while(m--)
{
cin>>k;
cin>>t;
mark[t]=true;;
while(--k)
{
cin>>a;
mark[a]=true;
merge(t,a);
}
}
int count=1;
int root0=find(0);//找出0所在的集合,因为0在所有集合中都是疑似病人
for(int i=1;i<n;i++)//在所有学生中找出在集合某一个集合而且与0号接触或者间接接触的人
if(mark[i] && find(i)==root0 )count++;
cout<<count<<endl;
}
// system("pause");
return 0;
}