POJ2524_并查集

原创 2013年12月04日 19:45:24
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 12171   Accepted: 5759

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 finding out how many different religions students in your university believe in. 

You know that there are n students in your university (0 < n <= 50000). It is infeasible for you to ask every student their religious beliefs. Furthermore, many students are not comfortable expressing their beliefs. One way to avoid these problems is to ask m (0 <= m <= n(n-1)/2) pairs of students and ask them whether they believe in the same religion (e.g. they may know if they both attend the same church). From this data, you may not know what each person believes in, but you can get an idea of the upper bound of how many different religions can be possibly represented on campus. You may assume that each student subscribes to at most one religion.

Input

The input consists of a number of cases. Each case starts with a line specifying the integers n and m. The next m lines each consists of two integers i and j, specifying that students i and j believe in the same religion. The students are numbered 1 to n. The end of input is specified by a line in which n = m = 0.

Output

For each test case, print on a single line the case number (starting with 1) followed by the maximum number of different religions that the students in the university believe in.

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

Hint

Huge input, scanf is recommended.
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAXN 50000
class UFS{
public:
	UFS(){
		memset(p,0,sizeof(p));
		memset(rank,0,sizeof(rank));
	}
	void Make_Set(int x){
		p[x] = x;
		rank[x] = 0;
	}
	void Union(int x, int y){
		Link(Find_Set(x),Find_Set(y));
	}
	void Link(int x, int y){
		if(rank[x] > rank[y]){
			p[y] = x;
		}
		else{
			p[x] = y;
			if(rank[x] == rank[y])
				rank[y]++;
		}
	}
	int Find_Set(int x){
		if(p[x]!=x)
			p[x] = Find_Set(p[x]);
		return p[x];
	}
private:
	int p[MAXN+4];
	int rank[MAXN+4];
};

//#define UNSUBMTI
int main()
{
#ifdef UNSUBMTI
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
#endif
	int m,n;
	int j,k;
	int t = 0;					//测试数据的组数
	int count;					//the number of religion
	UFS * religion = new UFS();
	while(scanf("%d%d",&n,&m)==2 && (n||m)!=0)
	{
		count = n;
		++t;
		for(int i=1; i<=n; i++)
			religion->Make_Set(i);
		for(int i=1; i<=m; i++){
			scanf("%d%d",&j,&k);
			religion->Union(j,k);
		}
		for(int i=1; i<=n; i++){
			if(religion->Find_Set(i)!=i)
				count--;
		}
		printf("Case %d: %d\n",t,count);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23093   Acce...

poj2524(并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 19940   Acce...

[并查集]POJ 2524 Ubiquitous Religions

传送门:Ubiquitous Religions Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 655...

POJ 2524 并查集的水题 Ubiquitous Religions

单纯的并查集的题目所以比较简单 需要注意的是由于读入的数据量比较大所以读入用scanf比较好 #include #include #define size_num 51000 using namesp...

POJ2524--Ubiquitous Religions(并查集)

并查集......

POJ 2524 Ubiquitous Religions 详细题解(并查集)

题目链接:http://poj.org/problem?id=2524   这道题属于并查集     题目大意: 在一个学校内调查学生的信仰情况,告诉你学校有n个人,给你共m组x,y表示信教情况相同,...
  • xdz78
  • xdz78
  • 2015-08-05 17:38
  • 340

POJ 2524 Ubiquitous Religions【并查集模板】

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 30...

POJ 2524 Ubiquitous Religions(简单的并查集)

Ubiquitous Religions 点击打开题目链接 Time Limit: 5000MS   Memory Limit: 65536K Total Sub...

poj 2524 并查集裸

There are so many different religions in the world today that it is difficult to keep track of them ...

POJ 2524 Ubiquitous Religions (并查集)

输入两个数字的组合表示这两个人同信仰,问最后又多少种信仰 太明显的并查集,没什么好说的了,只是这题压缩路径会效率很差,因为并的操作是大多,不压缩路径对于并操作来说更快 压缩路径后并的操作要遍历数组,效...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)