POJ 2524 Ubiquitous Religions

来源:互联网 发布:瓦尔特磨床编程网 编辑:程序博客网 时间:2024/05/16 13:48

问题的大意是:告诉你A和B在同一个宗教,让你判断最多一共有多少个不同的宗教

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

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAX_N 50010int 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);    }}


0 0
原创粉丝点击