codevs 5331 感冒病毒
题目描述 Description
一种感冒病毒正在学校里传播,这所学校有n个学生,m个学生社团,每个学生可能参加了多个社团,因为同一个社团的学生交流较多,所以如果一个学生感染上感冒病毒,那么他所在的社团里的所有学生都会感染上感冒病毒,现在已知0号学生感染上感冒病毒,问现在有多少人会感染上感冒病毒。
输入描述 Input Description
输入的第一行是两个整数n和m,表示学生的数目和社团的数目,学生的编号为0到n-1。
接下来m行,每行首先是一个数ki,表示这个社团有ki个人,接下来ki个整数,表示这个社团里每个学生的编号aij。
输出描述 Output Description
输出为一行,包含一个整数。表示感染感冒病毒的人数。
样例输入 Sample Input
100 4
2 1 10
5 10 13 11 12 14
2 0 1
2 9 2
样例输出 Sample Output
7
数据范围及提示 Data Size & Hint
对于100%的数据,3<=n<=30000
对于100%的数据,3<=m<=500
对于100%的数据,1<=ki<=n
对于100%的数据,0<=aij<n。
思路:
并查集,然后枚举所有点,如果i的代表元素与0的代表元素相同,ans++。
代码:
#include<cstdio> #define maxn 30001 using namespace std; int n,m,fa[maxn],ans,k; int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } int main() { int i,j; scanf("%d%d",&n,&m); for(i=0;i<n;i++) fa[i]=i; for(i=1;i<=m;i++) { int x,y; scanf("%d",&k); if(k>0) scanf("%d",&x); else continue; for(j=1;j<k;j++) { scanf("%d",&y); int xx=find(x),yy=find(y); if(fa[xx]!=fa[yy]) fa[xx]=fa[yy]; x=y; } } int xx=find(0); for(i=0;i<n;i++) if(find(i)==xx) ans++; printf("%d",ans); return 0; }