The Suspects——并查集求联通块数量的模板题
题意:
n个学生分属m个团体,一个学生可以属于多个团体。一个学生疑似患病,则他所属的整个团体都疑似患病。已知0号疑似患病,以及每个团体都有哪些学生构成,求一共有多少个学生疑似患病
题解:
很经典的并查集的题目,找一个num[]数组记录每一个以当前下标为根节点的集合的个体数目,最后输出0号的根节点对应的num值,就是0号学生所在团体的人数。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; typedef long long ll; const int maxn=5e5+5; int f[maxn]; int n,m; int num[maxn]; int a[maxn]; int Find(int x) { return x==f[x]?x:f[x]=Find(f[x]); } void join(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) { f[fx]=fy; num[fy]+=num[fx]; } } int main() { while(scanf("%d%d",&n,&m) && (n || m)) { for(int i=0;i<n;i++)f[i]=i,num[i]=1; while(m--) { int k; scanf("%d",&k); for(int i=1;i<=k;i++)scanf("%d",&a[i]); for(int i=1;i<k;i++)join(a[i],a[i+1]); } int k=Find(0); printf("%d\n",num[k]); } return 0; }