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;
}
标签:
GDUT_22级寒假训练专题五
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】