POJ2524-宗教问题-并查集-ACM

简介: 太难的搞不过,只能来写简单的了   POJ2524   无所不在的宗教 世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。

太难的搞不过,只能来写简单的了

 


POJ2524


 

无所不在的宗教

世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。

输入格式

可以输入多个测试用例(Case),每一个用例的第一行包含整数nmn表示学生编号(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

 

代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int MAXN=50001;
 5 int pa[MAXN];
 6 int rank[MAXN];
 7 
 8 void make_set(int x){
 9     pa[x] = x;
10     rank[x] = 0;
11 }
12 
13 int find_set(int x){
14     if(x != pa[x]){
15         pa[x] = find_set(pa[x]);
16     }
17     return pa[x];
18 }
19 
20 void union_set(int x,int y){
21     x = find_set(x);
22     y = find_set(y);
23 
24     if(rank[x] >  rank[y]){
25         pa[y] = x;
26     }
27     else{
28         pa[x] = y;
29         if(rank[x] == rank[y]){
30             rank[y]++;
31         }
32     }
33 }
34 
35 
36 int main(void){
37     int n,m,kase=0,count;
38     while(scanf("%d%d",&n,&m) == 2 && n!=0 && m!=0){
39         int i;
40         for(i=1;i<=n;i++){
41             make_set(i);
42         }
43         for(i=0;i<m;i++){
44             int a,b;
45             scanf("%d%d",&a,&b);
46             union_set(a,b);    
47         }
48         count = 0;
49         for(i=1;i<=n;i++){
50             if(i == pa[i]){
51                 count++;
52             }
53         }
54         printf("Case %d: %d\n",++kase,count);
55     }
56     return 0;
57 }

 


 

目录
相关文章
|
5月前
【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)
**USACO1.5八皇后挑战**是关于在$n\times n$棋盘上放置棋子的,确保每行、每列及两条主对角线上各有一个且仅有一个棋子。给定$6$作为输入,输出前$3$个解及解的总数。例如,对于$6\times6$棋盘,正确输出应包括解的序列和总数。代码使用DFS解决,通过跟踪对角线占用状态避免冲突。当找到所有解时,显示前三个并计数。样例输入$6$产生输出为解的前三个排列和总数$4$。
37 0
UVa872 - Ordering(拓扑排序)
UVa872 - Ordering(拓扑排序)
57 0
poj 2352 Stars 树状数组
树状数组,简单题,我刚刚开始学的时候就a了,不多说什么了,直接贴代码。
32 0
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
31 0
|
机器学习/深度学习 存储 缓存
Lecture 3:动态规划
Lecture 3:动态规划
112 1
POJ 3494 Largest Submatrix of All 1’s(单调栈)
POJ 3494 Largest Submatrix of All 1’s(单调栈)
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
89 0
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
152 0
2021杭电多校第三场-Road Discount-wqs二分+最小生成树
get函数是求出将黑色的边权加上一个值x之后的一个花费,我们会这个函数处理出x=-1000->1000的所有情况,然后将信息储存在save中,然后在询问的时候,直接遍历save集合,遇见满足情况的便直接输出,否则输出-1,虽然没有-1的情况/doge
137 0
2021杭电多校第三场-Road Discount-wqs二分+最小生成树
[Nowcoder] network | Tarjan 边双连通分量 | 缩点 | LCA倍增优化 | 并查集
题目描述 A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers are connected directly or indirectly by successive links, so data can be transformed between any two computers.
121 0
[Nowcoder] network | Tarjan 边双连通分量 | 缩点 | LCA倍增优化 | 并查集