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

POJ 2524 Ubiquitous Religions

2014-07-31 08:36 429 查看
问题的大意是:告诉你A和B在同一个宗教,让你判断最多一共有多少个不同的宗教

我们可以在输入的同时就将其的种类划分号,只需要判断par[i]==i,说明这是一个宗教,ans++即可

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX_N 50010

int n,m;
int par[MAX_N];
int rank[MAX_N];//起一定的节省内存空间的作用

void init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
rank[i]=0;
}
}

//查询树的根
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);//路径压缩,对于每个节点,一旦向上走到了一次根节点,就把这个店到父亲的边改为直接连向边

}

void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
{
//将x设为y的子树
par[x]=y;
}
else{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}

int main()
{
int t=0;
while(~scanf("%d %d",&n,&m))
{
if(m==n&&n==0)
break;
init(n);
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d %d",&a,&b);
unite(a,b);
}
int ans=0;
for(int i=0;i<n;i++)
{
if(par[i]==i)
ans++;
}
printf("Case %d: %d\n",++t,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ 并查集 2524