美文网首页
POJ-1611 The Suspects

POJ-1611 The Suspects

作者: Cyril1317 | 来源:发表于2017-01-18 10:52 被阅读0次

    1、题意##

    为了防止SARA传播,NSYSU收集所有学生组的成员列表,一旦群组中的成员是可疑人员,群组中的所有成员都是可疑人员。当学生被认定为患病嫌疑时,识别所有有嫌疑的学生并不容易。你的工作是写一个程序,找到所有的有嫌疑的学生。
    也就是用并查集将每一组的同学连起来,一旦组内有一个人有嫌疑,直接排除ta所在的那组。

    2、输入数据分析

    100 4  //第一组样例,总数n = 100人, m = 4个小组
    2 1 2  //第一个数据k代表小组总不能人数,后面数据是小组组员的号数
    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 0 //n, m为0,结束输入
    

    3、输出数据分析

    4  //第1、3、4小组为感染者组,共4人
    1
    1
    

    4、代码样例

    #include <stdio.h>
    
    int pre[50005]; //父节点数组
    int lw[50005];
    int i, j;
    
    void ini(int n)  //预处理
    {
        for(i = 0; i < n; i++)
        {
            pre[i]=i;
            lw[i]=1;//可用memset(lw, 0, sizeof(lw))放在for循环之前;
        }
    }
    
    int Find(int x) //查找根节点
    {
        if(x!=pre[x])
            pre[x] = Find(pre[x]);
        return pre[x];
    }
    
    void uoin(int x,int y)//合并
    {
        int xx = Find(x);
        int yy = Find(y);
        if(xx != yy)
        {
            pre[xx] = yy;
            lw[yy] += lw[xx];
        }
    }
    
    int main()
    {
        int n, m, t, x, y, res;
        while(scanf("%d%d", &n, &m) != EOF)
        {
            if(n==0 && m==0) break;//n,m都为0,直接结束程序
            ini(n);
            for(i = 0; i < m; i++)
            {
                scanf("%d", &t);
                scanf("%d", &x);//输入小组第一号成员
                for(j = 1; j < t; j++)
                {
                    scanf("%d", &y);//输入小组剩余成员
                    uoin(x, y);//每输入一个和上一个连在一起
                    x = y;
                }
            }
            res = Find(0);//看有没有0节点,如果有查找谁与0号连在一起
            printf("%d\n", lw[res]);//取个巧输出
        }
        return 0;
    }
    

    PS. 这题不能用#include<bits/stdc++.h>会挖

    相关文章

      网友评论

          本文标题:POJ-1611 The Suspects

          本文链接:https://www.haomeiwen.com/subject/lqivbttx.html