POJ P2524 Ubiquitous Religions

Ubiquitous Religions

Description

世界上有如此多的不同的宗教,它是很难跟踪他们。你能在你们的学校里找到多少种大家感兴趣的宗教?

你知道你大学n学生(0n<=50000)。你直接去问他们的宗教信仰不可行。此外,许多学生不舒服表达自己的信仰。为了避免这些问题的方法之一是m0mnn-1/ 2)对学生问他们是否他们信奉同一宗教(例如他们可能知道他们都参加相同的教堂)。从这个数据,你可能不知道,每个人都相信,但你可以知道你们学校最多有多少种不同的宗教。你可以假定每个学生最多信仰一个宗教。

Input

输入包括一数。每一种情况下,从一个线指定整数nm接下来的m行由两个整数ijij指定学生信奉同一宗教。学生编号1n的输入端通过一个线中,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


题解:又是一道并查集的题目,而且还是英文题。。。题目已经翻译出来,简单叙述如下,就是通过询问m对同学是否为相同的宗教信仰,让你求出这个学校不同宗教信仰的最大值。还是用到了并查集的算法,Initialization()函数用来初始化各个点的父节点;getfather()函数用来寻找各节点的头结点;Relationship()函数用来链接各相同头结点。


#include <iostream>
#define MAX 50001
int father[MAX];
using namespace std;

int getfather(int x){
	if(x!=father[x])
		father[x]=getfather(father[x]);
	return father[x];
}

void Initialization(int n)
{
	int i;
	for(i=1;i<=n;i++)
		father[i]=i;
}

void Relationship(int x,int y){
	x=getfather(x);
	y=getfather(y);
	if(x!=y) father[y]=x;
}

int main()
{
	int n,m,i,a,b,sum;
	int time=1;
	while(cin>>n>>m)
	{
		int sum=0;
		if(m==0 && n==0)
		   break;
	      Initialization(n);   
		for(i=1;i<=m;i++)
		{
			cin>>a>>b;
			Relationship(a,b);
		}
		for(i=1;i<=n;i++)
		  if(i==getfather(i))
		       sum++;
		cout<<"Case "<<time++<<": "<<sum<<endl; 
	}
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值