我是靠谱客的博主 简单蜜粉,这篇文章主要介绍并查集之The Suspects,现在分享给大家,希望可以做个参考。

在不传播疾病的大学(NSSU)中,有很多学生群体。同一组的学生经常互相交流,学生可以加入几个小组。为了防止SARS可能传播,NSUSU收集所有学生组的成员名单,并在其标准操作程序(SOP)中执行以下规则。

一旦一个小组中的成员是嫌疑犯,该组中的所有成员都是嫌疑犯。

然而,他们发现,当一个学生被认定为嫌疑犯时,不容易识别所有的嫌疑犯。你的工作是写一个程序,找出所有嫌疑犯。

input

输入文件包含几种情况。每个测试用例从两个整数n和m开始,其中n是学生的数目,m是组的数目。你可以假设0<n<=30000,0 <=m <=500。每个学生都有0到N到1之间的一个唯一的整数,最初学生0被认定为所有案件中的嫌疑犯。这一行后面是M组成员列表,每组一行。每一行都以整数k开头,表示该组中成员的数目。根据成员的数量,有K整数代表这个组的学生。一行中的所有整数由至少一个空间分隔。

n=0,m=0的情况表示输入结束,不需要处理。

output

对于每种情况,输出一行中嫌疑犯的数量。

Sample Input

复制代码
1
2
3
4
5
6
7
8
9
10
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

复制代码
1
2
3
4 1 1
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int per[30100], num[30100],a[30100]; int find(int x) { if(x==per[x]) return x; return find(per[x]); } void join(int x, int y) { int fx = find(x); int fy = find(y); if(fx!= fy) { per[fx]=fy; num[fy]+=num[fx]; } } int main () { int n,m,i,k; while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(i=0;i<n;++i) { per[i]=i; num[i]=1; } while(m--) { int t; scanf("%d", &t); for(i=0;i < t; ++i) { scanf("%d", &a[i]); } for(i=0 ; i<t-1;i++) join(a[i], a[i + 1]);//把同一小组的归类 使他有共同的祖先 } k=find(0); printf("%dn", num[k]); } return 0; }

 

最后

以上就是简单蜜粉最近收集整理的关于并查集之The Suspects的全部内容,更多相关并查集之The内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部