您的位置:首页 > 其它

POJ 1611 The Suspects

2014-07-15 23:50 309 查看
题目大意:

现流行病传播严重,需采取隔离措施,现一个学校中有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, 严峻的,严重的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: