感冒病毒

【题目描述】 一种感冒病毒正在学校里传播,这所学校有 n 个学生,m 个学
生社团,每个学生可能参加了多个社团,因为同一个社团的学生交流较多,所
以如果一个学生感染上感冒病毒,那么他所在的社团里的所有学生都会感染上
感冒病毒,现在已
知 0 号学生感染上感冒病毒,问现在有多少人会感染上感冒病毒。
【输入】
输入文件:suspects.in
输入的第一行是两个整数 n 和 m,表示学生的数目和社团的数目,学生的编
号为 0 到 n-1。
接下来 m 行,每行首先是一个数 ki,表示这个社团有 ki 个人,接下来 ki
个整数,表示这个社团里每个学生的编号 aij。
【输出】
输出文件:suspects.out
输出为一行,包含一个整数。表示感染感冒病毒的人数。
【输入样例】
100 4 2 1 10 5 10 13 11 12 14
2 0 1
2 9 2
【输出样例】
7
【数据范围】
对于 100%的数据,3<=n<=30000
对于 100%的数据,3<=m<=500 对于
100%的数据,1<=ki<=n 对于 100%
的数据,0<=aij<n。

并查集板子

#include<cstdio>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<iostream>
#include<cstring>

using namespace std;
const int maxn = 2000000;
int pa[maxn];
int find(int a)
{
  if(pa[a] == a) return a;
  else return pa[a] = find(pa[a]);
}
int main()
{
  freopen("suspects.in","r",stdin);
  freopen("suspects.out","w",stdout);
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i = 1;i <= n;i++) pa[i] = i;
  for(int i = 1;i <= m;i++){
    int kass;scanf("%d",&kass);
    int root;
    for(int j = 1;j <= kass;j++){
      int x;
      scanf("%d",&x);    
      if(j == 1) root = find(x);
      pa[find(x)] = root;
    }
  }
  int zat = find(0);int ans = 0;
  for(int i = 0;i <= n;i++) if(find(i) == zat) ans++;
  printf("%d",ans);
  return 0;
}
posted @ 2017-11-04 22:37  rsqppp  阅读(108)  评论(0)    收藏  举报