zoukankan      html  css  js  c++  java
  • The Suspects

    Description

    严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。
    在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下:
    一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。
    然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。
     

    Input

    输入文件包含多组数据。
    对于每组测试数据:
    第一行为两个整数n和m, 其中n是学生的数量, m是团体的数量。0 < n <= 30000,0 <= m <= 500。
    每个学生编号是一个0到n-1之间的整数,一开始只有0号学生被视为可能的患者。
    紧随其后的是团体的成员列表,每组一行。
    每一行有一个整数k,代表成员数量。之后,有k个整数代表这个群体的学生。一行中的所有整数由至少一个空格隔开。
    n = m = 0表示输入结束,不需要处理。

    Output

    对于每组测试数据, 输出一行可能的患者。

    Sample Input

    100 4
    2 1 2
    5 10 13 11 12 14
    2 0 1
    2 99 2
    200 2
    1 5
    5 1 2 3 4 5
    1 0
    0 0

    Sample Output

    4
    1
    1




    解题思路:用并查集的解法,并把0当作所有与0的数的根节点,并把改变后的值放入pre数组,最后判定pre数组内有多少个节点是以0为根节点的即可。




    具体代码如下:


    #include "iostream"
    #include "cstdio"
    #include "cstring"
    using namespace std;
    int  pre[30050];
                //t 用于标记独立块的根结点
    int Find(int x)
     {
         int r=x;
         while(r!=pre[r])
             r=pre[r];

         int i=x,j;
         while(pre[i]!=r)
         {
             j=pre[i];
             pre[i]=r;
             i=j;
         }
         return r;
     }

     void mix(int x,int y)
     {
         int fx=Find(x),fy=Find(y);
         if (fx>fy)
            pre[fx]=fy;
         if(fx<fy)
            pre[fy]=fx;
     }

     int main()
     {
         int N,M,a,b,i,j,ans,k,n=0;
         while(scanf("%d%d",&N,&M)!=EOF&&N)
         {   int sum=0;
             for(int i=0;i<N;i++)          //初始化
                pre[i]=i;
                while(M--)
           {
                scanf("%d",&k);
                scanf("%d",&a);
                 for(int j=1;j<k;j++)
                 {
                 scanf("%d",&b);
                 mix(a,b);
                 }

            }
          for(int h=0;h<N;h++)
          if(Find(h)==0)
           sum++;
          printf("%d ",sum);
          sum++;
         }
         return 0;
     }

  • 相关阅读:
    图数据库的选择与对比(Neo4j)
    pip install ahocorasick报错以及Requirement already satisfied问题
    从知识图谱到认知图谱: 历史、发展与展望
    kafka(一)—— kafka安装简单使用
    python管理docker
    Javaweb前后端分离项目docker部署
    django + uwsgi + nginx部署(前后端不分离)
    坑(八)—— LayUI框架中append新的元素的问题
    docker(三)—— 避免一直输入sudo
    坑(七)—— 表单提交方式
  • 原文地址:https://www.cnblogs.com/llfj/p/5685964.html
Copyright © 2011-2022 走看看