C - The Suspects

C - The Suspects

2019冠状病毒病(英语:Coronavirus disease 2019,缩写:COVID-19 ),是一种由严重急性呼吸系统综合症冠状病毒2型(缩写:SARS-CoV-2)引发的传染病。此病在全球各国大规模爆发并急速扩散,成为人类历史上致死人数最多的流行病之一。 很显然,目前最好的办法就是将所有可能的患者都隔离起来。 现在某高校正在排查可能的患者,这个高校中有多个社团,每个社团经常进行内部交流,一名学生可能会加入多个社团。学校认为一旦某个社团里出现一名可疑患者,这整个社团的学生都被视为是可能的患者。 现在请你帮忙找到这所学校的所有可能的患者。(0号是患者)
Input
输入文件包含多组数据。
对于每组测试数据:
第一行为两个整数n和m, 其中n是学生的数量, m是社团的数量。0 < n <= 30000,0 <= m <= 500。
接下来m行,每一行有一个整数k,代表社团中学生的数量。之后,有k个整数代表这个社团里每个学生的编号(在0到n-1之间)。
n = m = 0表示输入结束,不需要处理。
Output
对于每组测试数据, 输出可能的患者数目。
Sample Input
100 4
2 1 2
6 11 13 50 12 14
2 0 1
2 99 2
200 2
1 5
6 5 6 7 8 9 10
1 0
0 0
Sample Output
4
1
1

思路

1.并查集的简单应用
2.输出包含0的并查集中元素的个数即可。

代码

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 3e4;
int fa[N + 5], a[N + 5];
int n, m, cnt, ans;

int query(int x)
{
	if(x != fa[x])	fa[x] = query(fa[x]);
	return fa[x];
}

int main()
{
	while(1)
	{
		ans = 0;
		scanf("%d%d", &n, &m);
		if(!n && !m)	break;
		for(int i = 0; i <= n; ++i)		fa[i] = i;
		for(int i = 1; i <= m; ++i)
		{
			scanf("%d", &cnt);
			if(!cnt)	continue;
			for(int i = 1; i <= cnt; ++i)
				scanf("%d", &a[i]);
			int r1 = query(a[1]);
			for(int i = 2; i <= cnt; ++i)
			{
				int r2 = query(a[i]);
				fa[r2] = r1;
			}
		}
		int r1 = query(fa[0]);
		for(int i = 0; i <= n; ++i)
		{
			if(query(fa[i]) == r1)
				++ans;
		}
		printf("%d\n", ans);
	}
	
	return 0;
}

posted @ 2023-02-22 21:37  Keith-  阅读(12)  评论(0编辑  收藏  举报