题目大意:
现流行病传播严重,需采取隔离措施,现一个学校中有n名学生(0 < n ≤ 30000)以及m个团体(0 ≤ m ≤ 500),一个学生可以属于多个团体,现隔离措施为,如果一个学生被确定为疑似病例,则该学生所在的团体也将被作为疑似病例而隔离,学生编号为0 ~ n - 1,假设初始时0为疑似病例。
现有多个测例,每个测例中给出n和m,接下来给出每个团体的具体情况,每个团体中先给出团体的人数k,接下来给出这k个人的编号,测例以n、m = 0结束,要求对于每个测例都得输出最终被隔离的总人数。
注释代码:
/*
* Problem ID : POJ 1611 The Suspects
* Author : Lirx.t.Una
* Language : C
* Run Time : 16 ms
* Run Memory : 276 KB
*/
#include <stdio.h>
//学生的最大数量
#define MAXN 30000
short fath[MAXN];//并查集,数量未超过short范围
short sum[MAXN];//sum[i]表示以i结点为树根的数总共有多少人(即多少个结点)
//肯定也不超过MAXN,因此也使用short
int
find(int x) {
if ( x == fath[x] ) return x;
return fath[x] = find( fath[x] );
}
int
merge( int x, int y ) {
int fx, fy;
fx = find(x);
fy = find(y);
if ( fx != fy ) {//fy接到fx的同时
//fy的人也得加到fx上
fath[fy] = fx;
sum[fx] += sum[fy];
}
}
int
main() {
int n, m;//人数,团体数
int k;//临时存放每个团体的人数
int fi, nxt;//团体中的第一个人first编号
//以及团体中其余人的编号next
int i;//计数变量
while ( scanf("%d%d", &n, &m), n ) {
for ( i = 0; i < n; i++ ) {//并查集初始化
fath[i] = i;
sum[i] = 1;
}
while ( m-- ) {
scanf("%d%d", &k, &fi);
k--;
while ( k-- ) {
scanf("%d", &nxt);
merge( fi, nxt );//都将后面的人和第一个所在集合合并
}
}
printf("%d\n", sum[ find(0) ]);//注意,题中要求0号为传染源
//注意不能直接使用fath[0],因为0号可能未进行过路径压缩,因此
//必须使用find函数来查找0所在集合的树根
}
return 0;
}
无注释代码:
#include <stdio.h>
#define MAXN 30000
short fath[MAXN];
short sum[MAXN];
int
find(int x) {
if ( x == fath[x] ) return x;
return fath[x] = find( fath[x] );
}
int
merge( int x, int y ) {
int fx, fy;
fx = find(x);
fy = find(y);
if ( fx != fy ) {
fath[fy] = fx;
sum[fx] += sum[fy];
}
}
int
main() {
int n, m;
int k;
int fi, nxt;
int i;
while ( scanf("%d%d", &n, &m), n ) {
for ( i = 0; i < n; i++ ) {
fath[i] = i;
sum[i] = 1;
}
while ( m-- ) {
scanf("%d%d", &k, &fi);
k--;
while ( k-- ) {
scanf("%d", &nxt);
merge( fi, nxt );
}
}
printf("%d\n", sum[ find(0) ]);
}
return 0;
}
单词解释:
intercommunicate:vi, 相互联络,相互交往
suspect:n, 嫌疑犯,疑似病例
transmission:n, 传动装置,传送,传播(流行病)
be recognized as:vt, 被认为是,被公认为
sth of unknown aetiology:vi, 原因不明的某物
aetiology:n, 病原学
pneumonia:n, 肺炎
atypical:adj, 非典型的
syndrome:n, 综合征,并发症
respiratory:adj, 呼吸道的
acute:adj, 急性的(医学)
severe:adj, 严峻的,严重的