POJ 1611 The Suspects

题目大意:

        现流行病传播严重,需采取隔离措施,现一个学校中有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, 严峻的,严重的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值