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结束,要求对于每个测例都得输出最终被隔离的总人数。
题目链接
注释代码:
单词解释:
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, 严峻的,严重的
现流行病传播严重,需采取隔离措施,现一个学校中有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, 严峻的,严重的
相关文章推荐
- POJ 1611 The Suspects
- POJ 1611 The Suspects 解题报告
- POJ 1611 The Suspects
- POJ 1611 The Suspects
- POJ 1611 The Suspects
- poj - 1611 The Suspects
- poj the suspects 1611
- POJ 1611 The Suspects
- poj 1611 The Suspects
- poj 1611 The Suspects 并查集
- POJ 1611 The Suspects【并查集入门】
- POJ 1611 The Suspects 并查集
- [poj 1611]The Suspects[并查集模板][递归与非递归实现]
- poj 1611 The Suspects // hoj 1564 The Suspects 并查集
- 【原】 POJ 1611 The Suspects 并查集 解题报告
- POJ 1611 The Suspects 并查集
- POJ 1611:The Suspects 并查集求解
- poj_1611 The Suspects
- POJ 1611 - The Suspects
- poj 1611 The Suspects