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;
}

 

posted @ 2016-11-08 08:49  一叶落尽天下秋  阅读(199)  评论(0编辑  收藏  举报