[题目描述]
题意:
有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数。
感想:
一道简单的并查集,活活了好些天,还是~,看着讨论区大佬们的各种1A,崩溃ing~
这题就不写题解了,哭哭~
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max_n=3e4+10;
int n,m;
int par[Max_n];
int rank[Max_n];
int num[Max_n];
int find(int x){
if(par[x]==x)return x;
return par[x]=find(par[x]);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y)return;
if(rank[x]<rank[y])par[x]=y;
else par[y]=x;
if(rank[x]==rank[y])rank[x]++;
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n!=0){
for(int i=0;i<n;i++){
par[i]=i;
rank[i]=0;
}
for(int i=0;i<m;i++){
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)scanf("%d",&num[i]);
for(int i=1;i<k;i++)unite(num[0],num[i]);
}
int ans=0,par=find(0);
for(int i=0;i<n;i++){
if(find(i)==par)ans++;
}
printf("%d\n",ans);
}
return 0;
}