ACM: Ubiquitous Religions-并查集-解题报告

Ubiquitous Religions
Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Description
当今世界有很多不同的宗教,很难通晓他们。你有兴趣找出在你的大学里有多少种不同的宗教信仰。
你知道在你的大学里有n个学生(0 < n <= 50000) 。你无法询问每个学生的宗教信仰。此外,许多学生不想说出他们的信仰。避免这些问题的一个方法是问m(0 <= m <= n(n - 1)/ 2)对学生, 问他们是否信仰相同的宗教( 例如他们可能知道他们两个是否去了相同的教堂) 。在这个数据中,你可能不知道每个人信仰的宗教,但你可以知道校园里最多可能有多少个不同的宗教。假定每个学生最多信仰一个宗教。
Input
有多组数据。对于每组数据:
第一行:两个整数n和m。
以下m行:每行包含两个整数i和j,表示学生i和j信仰相同的宗教。学生编号从1到n。
输入的最后一行中,n = m = 0。
Output
对于每组测试数据,输出一行,输出数据序号( 从1开始) 和大学里不同宗教的最大数量。(参见样例)
Sample Input
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
Sample Output
Case 1: 1
Case 2: 7

这题目没什么好说的和之前的题目基本一样,注意下维护的是未知信仰种类的人就行。AC代码:
#include"iostream"
#include"cstdio"
#include"algorithm"
#include"cmath"
#include"cstring"
using namespace std;

int pe[100000];
int num;

int find(int x) {
	return	pe[x]==x?x:(pe[x]=find(pe[x]));
}

int main() {
	int n,m,a,b,time=1;
	while(~scanf("%d%d",&n,&m)) {
		if(!n&&!m)break;
		for(int i=0; i<n; i++) {
			pe[i]=i;
			num=n;
		}
		for(int i=0; i<m; i++) {
			scanf("%d%d",&a,&b);
			int root1=find(pe[a]);
			int root2=find(pe[b]);
			if(root1!=root2) {
				pe[root2]=root1;
				num--;   //记录还有多少个人信仰种类不知道
			}
		}
		printf("Case %d: %d\n",time++,num);
	}
	return 0;
}

  

时间: 2024-11-05 16:08:31

ACM: Ubiquitous Religions-并查集-解题报告的相关文章

ACM: 畅通工程-并查集-解题报告

畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &l

[ACM] POJ 3295 Ubiquitous Religions (并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23093   Accepted: 11379 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

POJ 2524 Ubiquitous Religions (幷查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23090   Accepted: 11378 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

ACM: The Suspects-并查集-解题报告

The Suspects Time Limit:1000MS Memory Limit:20000KB 64bit IO Format:%lld & %llu Description 严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁.为了减少传播给别人的机会, 最好的策略是隔离可能的患者. 在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体.同一组的学生经常彼此相通,一个学生可以同时加入几个小

poj 1984 Navigation Nightmare 并查集 解题报告

Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000) vertical and horizontal roads each of varying lengths (1 <= length <= 1000) connect the farms.

POJ 2524-Ubiquitous Religions(并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 25383   Accepted: 12530 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

2016 UESTC ACM Summer Training Team Selection (2)解题报告

总体来说,个人英语水平还太蹩脚,此次大部分时间都花在理解题意上了,而且到最后有些题目的意思还是不理解,orz... 链接→2016 UESTC ACM Summer Training Team Selection (2)  Problem A Popular Vote Accept: 0    Submit: 0 Time Limit: 2000 mSec  Problem Description In an election with more than two candidates, it

HDU ACM 4496 D-City -&gt;并查集+逆向

题意:给定一张图,按照输入的边逐个删除,求每次删除一条边之后图的联通块数量. 分析:反向并查集求联通分量,假设起始各个点都不连通,接着从最后一条边开始添加,如果新加入的边联通了两个联通块,则联通分量减1(保存在数组中),最后正序输出结果即可. #include<iostream> #include<algorithm> using namespace std; int p[10005]; struct EDGE { int x,y; } edge[100005]; int ans[

并查集&amp;MST

[HDU] 1198 Farm Irrigation 基础最小生成树★ 1598 find the most comfortable road 枚举+最小生成树★★ 1811 Rank of Tetris 并查集+拓扑排序★★ 3926 Hand in Hand 同构图★ 3938 Portal 离线+并查集★★ 2489     Minimal Ratio Tree dfs枚举组合情况+最小生成树★ 4081     Qin Shi Huang's National Road System 最