codevs 5331 感冒病毒

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 惑&葬 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值