POJ2524-宗教问题-并查集-ACM
2014-10-06 19:46
253 查看
太难的搞不过,只能来写简单的了
世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。
【输入格式】
可以输入多个测试用例(Case),每一个用例的第一行包含整数n和m,n表示学生编号(1-n),在接下来的m行中,每一行包含两个整数,对应信仰同一宗教的两名学生的编号,输入结束行为n
= m=0。
【输出格式】
输出每一个测试用例中包含的学生信仰的最大宗教数量。
POJ2524
无所不在的宗教世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。
【输入格式】
可以输入多个测试用例(Case),每一个用例的第一行包含整数n和m,n表示学生编号(1-n),在接下来的m行中,每一行包含两个整数,对应信仰同一宗教的两名学生的编号,输入结束行为n
= m=0。
【输出格式】
输出每一个测试用例中包含的学生信仰的最大宗教数量。
样例输入
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
样例输出
Case 1: 1 Case 2: 7
代码
#include <iostream> using namespace std; const int MAXN=50001; int pa[MAXN]; int rank[MAXN]; void make_set(int x){ pa[x] = x; rank[x] = 0; } int find_set(int x){ if(x != pa[x]){ pa[x] = find_set(pa[x]); } return pa[x]; } void union_set(int x,int y){ x = find_set(x); y = find_set(y); if(rank[x] > rank[y]){ pa[y] = x; } else{ pa[x] = y; if(rank[x] == rank[y]){ rank[y]++; } } } int main(void){ int n,m,kase=0,count; while(scanf("%d%d",&n,&m) == 2 && n!=0 && m!=0){ int i; for(i=1;i<=n;i++){ make_set(i); } for(i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); union_set(a,b); } count = 0; for(i=1;i<=n;i++){ if(i == pa[i]){ count++; } } printf("Case %d: %d\n",++kase,count); } return 0; }
相关文章推荐
- POJ2524-宗教问题-并查集-ACM
- POJ 2524 宗教问题 并查集
- 普通并查集之宗教问题(题目)
- ACM小组内部预定函数 数学问题:
- 一个ACM问题
- acm新人常见问题
- 【并查集】数据结构与算法实验题 11.2 病毒排查问题
- acm pku 2234 解题报告(取子问题)
- 安装Visual Studio 6的"Error Lauching acmboot.exe"问题解决方法
- 食物链(并查集问题)pku1182
- PKU ACM 1012 JOSEPH问题
- 性别问题:计算机专业的女性要面对的问题--摘自ACM的一篇报告
- 关于ACM博弈组合问题
- http://acm.fzu.edu.cn/problem.php?pid=1564 C(n,k)和素数P的问题
- acm 北大 1942 网格问题
- ACM做音频传输的时候,有严重的延迟问题,这个控件来自网络,添加了4个录音缓冲区,解决延迟问题
- 浙大acm问题1003 (转)
- 浙大ACM的fire net问题
- joseph问题-北航的一个ACM题目
- POJ2524(并查集)