您的位置:首页 > 产品设计 > UI/UE

POJ P2524 Ubiquitous Religions

2013-11-01 20:40 357 查看
Ubiquitous Religions

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

题解:又是一道并查集的题目,而且还是英文题。。。题目已经翻译出来,简单叙述如下,就是通过询问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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: