题目链接
题意
给定n学生,m小组,0号学生是病人,一组中只要有一个病人全部得病,求病人人数
思路
并查集模版,把每个组的学生分别连在一起,最后遍历全部节点即可。
代码
#include<iostream>
#include<cmath>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
const int maxn=30500;
const int inf=0x3f3f3f3f;
int fa[maxn*3];
int ra[maxn];
int n,m,k;
void init(){
for(int i=0;i<maxn;i++){
fa[i]=i;
ra[i]=0;
}
return ;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unite(int x,int y){
x=find(x); y=find(y);
if(x==y)
return ;
else if(ra[x]<ra[y]){
fa[x]=y;
}
else{
fa[y]=x;
if(ra[x]==ra[y])
ra[x]++;
}
}
int main(){
IOS
while(cin>>n>>m){
if(n==0&&m==0)
break;
init();
while(m--){
cin>>k;
int a,b;
cin>>a; k--;
while(k--){
cin>>b;
unite(a,b);
}
}
int fa=find(0);
int ans=1;
for(int i=1;i<n;i++)
if(fa==find(i))
ans++;
cout<<ans<<endl;
}
}