http://acm.pku.edu.cn/JudgeOnline/problem?id=2524
题意:给你学生人数,以及宗教信仰相同的学生的编号、求出最多宗教信仰的个数。
#include <cstdio>
#include <iostream>
using namespace std;
int Father[50010];
int Number[50010];
int Max;
void Make_Set(int number)//构建集合
{
int i;
for(i = 1;i <= number;i ++)
{
Father[i] = i;
Number[i] = 1;
}
}
int Find_Set(int x)//查找父节点
{
if(x != Father[x])
Father[x] = Find_Set(Father[x]);
return Father[x];
}
void Union(int x,int y)
{
x = Find_Set(x);
y = Find_Set(y);
if(x == y)//若父节点相等,则说明他们信仰的是同一个宗教
return ;
Max --;//最大数目减1
if(Number[x] <= Number[y])
{
Father[x] = y;
Number[y] += Number[x];
}
else
{
Father[y] = x;
Number[x] += Number[y];
}
}
int main()
{
int i,cas = 0;
int data,number;
int a,b;
while(scanf("%d%d",&data,&number))
{
if(data+number == 0)
break;
Max = data;//初始化最大宗教
Make_Set(data);
for(i = 0;i < number;i ++)
{
scanf("%d%d",&a,&b);
Union(a,b);//合并a,b
}
printf("Case %d: %d/n",++cas,Max);
}
return 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
*/