Ubiquitous Religions
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
输出
示例输入
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
本题主要运用了并查集与哈希的方法,大意为输入n、m,找出这n个人中,一共有多少信仰的宗教,即有多少个不同的根节点
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int father[50010];
int f[50010];//用于哈希查找
int fin(int a)//查找根节点的函数
{
if(a!=father[a])
father[a]=fin(father[a]);//路径压缩
return father[a];
}
void un(int a,int b)//集合合并函数
{
int x=fin(a);
int y=fin(b);
if(x!=y)
father[y]=x;
}
int main()
{
int n,m,i,j,a,b;
int k=1;
while(~scanf("%d %d",&n,&m)&&n!=0&&m!=0)
{
int num=0;//记录根节点的个数
memset(f,0,sizeof(f));
for(i=1; i<=n; i++)
father[i]=i;
for(i=0; i<m; i++)
{
scanf("%d %d",&a,&b);
un(a,b);
}
for(i=1; i<=n; i++)
{
j=fin(i);
f[j]++;//哈希算法,将存在的某一个根节点记入数组中
}
for(i=1; i<=n; i++)
{
if(f[i]>0)
num++;
}
printf("Case %d: %d\n",k++,num);
}
return 0;
}