【每日总结】2021-2-5

【每日总结】2021-2-5

学习时间:7h
刷题数:0
学习内容:并查集
**题目:撸猫到底会不会上瘾!
不知从何时起,猫(Cat)已经开始成为一类校园新型毒品. 无数少女少男深受其害,一天不吸,浑身难受. 而就在最近,这种生物竟开始携带一种传染性极强的流行性病毒 —— 喵病毒 (Meow Viruses). 凡是接触猫的人,都极有可能感染喵病毒. 而我们一般称那些感染喵病毒的人,犯了喵病. 喵病的发病症状十分邪魔. 初期为连续性地疯狂撸猫,晚期甚至半夜爬上房顶学猫叫! 而由于喵病毒传染性极强,它已逐渐被认为是一种全球性的威胁. 为了减少传播给别人的机会, 最好的策略就是隔离可能的患者.
在Mr.蒟蒻的大学中,有许多学生团体. 同一个团体的学生经常彼此相通,一个学生可以同时加入几个团体. 为了防止喵病毒的传播,学校收集了所有学生团体的成员名单. 应对措施如下:

一旦一个团体中有一个患者,该团内的所有的成员就都可能是患者. 为了遏制这种病毒的传播,我们需要找到所有可能的患者. 现在已知编号为0的孟同学(感染源)已经犯了喵病,请你设计程序,找出所有可能的患者!

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

思路:
先把每一个团体内部都连在一棵树上,最后再遍历全体成员,如果和0号在同一棵树上,人数就加一。
我遇到了一个离奇的难题:我的代码在本地过样例,但是判题时编译错误。
可能是我人太蠢了。。。。。。
以下是我编译错误的代码,望好心人帮我解答

#include
int parent[31000];
int rank[3100];
int find(int x)
{
    while(x!=parent[x])
        x=parent[x]=parent[parent[x]];
    return x;
}
int unionSet(int a,int b)
{
    int roota=find(a);
    int rootb=find(b);
    if(roota==rootb)return 0;
    if(rank[roota]>rank[rootb])
        parent[rootb]=roota;
    else if(rank[roota]<rank[rootb])
        parent[roota]=rootb;
    else
    {
        parent[roota]=rootb;
        rank[rootb]++;
    }
    return 1;
}
int main()
{
    int n,m,i;
    while(scanf("%d %d",&n,&m))
    {
        if(n==0&&m==0)break;
        for( i=0; i<=n; i++)
        {
            parent[i]=i;
            rank[i]=1;
        }

        while(m--)
        {
            int k,a,b;
            scanf("%d",&k);
            scanf("%d",&a);
            k--;
            while(k--)
            {
                scanf("%d",&b);
                unionSet(a,b);
            }
        }
        int cnt=0;
        for( i=0; i<=n; i++)
        {
            if(find(i)==parent[0])
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

明天放假,好耶!
庚子年 小年 怀化

你可能感兴趣的:(每日总结)