poj 2524 Ubiquitous Religions

// 题意:一个学校有n人,其中有m对人是具有相同的宗教信仰,问这个学校里有多少种不同的宗教信仰

#include <iostream> //并查集
using namespace std;
int p[50010],hei[50010],n,m;
void init()
{
for(int i=1;i<=n;++i)
{
p[i]=i;
hei[i]=0;
}
}

//路径压缩,当我们经过"递归"找到祖先节点后,"回溯"的时候顺便将路径上的所有节点都直接指向祖先
int find(int x)
{
return p[x]==x ? x : p[x]=find(p[x]);
}

//每次应将小树合并到大树中,否则最坏情况下树会退化成一条链,使查找的时间复杂度为O(n)
void Union(int a,int b) //合并
{
int x=find(a),y=find(b);
if(x==y)
return ;
if(hei[x]>hei[y])
p[y]=x;
else
p[x]=b;
if(hei[x]==hei[y]) //若二者的高度相同,则合并后的高度要增加1
hei[y]++;
}
int main()
{
int t=1;
while(cin>>n>>m&&n)
{
init();
int a,b;
while(m--)
{
scanf("%d%d",&a,&b);
Union(a,b);
}
int ans=0;
for(int i=1;i<=n;++i)
{
if(find(i)==i)
ans++;
}
printf("Case %d: %d\n",t++,ans);
}
return 0;
}

posted on 2011-07-22 15:06  sysu_mjc  阅读(120)  评论(0编辑  收藏  举报

导航