zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    tigerVNC远程桌面,跨内网
    Nutch 二次开发之parse正文内容
    在一个字符串中找到第一个仅仅出现一次的字符。
    图像处理之霍夫变换(直线检測算法)
    EJB3.0开发环境的搭建
    uestc 250 数位dp(水)
    Matlab画图-非常具体,非常全面
    高性能I/O设计模式Reactor和Proactor
    leetcode第一刷_Path Sum II
    PreTranslateMessage作用和用法
  • 原文地址:https://www.cnblogs.com/jyhywh/p/6041442.html
Copyright © 2011-2022 走看看