POJ2524 Ubiquitous Religions (并查集)
2017-08-13 20:50
344 查看
题意分析
学校共有n个人,先给出m组信息,求问学校最多有多少种宗教信仰信奉者。
每组信息包括a,b两个人,表示a,b两人信奉同一种宗教。
初始化集合时,把每一个人都当做一个宗教。 读入信息时,如果发现2个人信奉的宗教不同(根节点祖先不同),合并这两个人,并使得宗教总数目-1, 最后输答案即可。
学校共有n个人,先给出m组信息,求问学校最多有多少种宗教信仰信奉者。
每组信息包括a,b两个人,表示a,b两人信奉同一种宗教。
初始化集合时,把每一个人都当做一个宗教。 读入信息时,如果发现2个人信奉的宗教不同(根节点祖先不同),合并这两个人,并使得宗教总数目-1, 最后输答案即可。
#include<stdio.h> #include<iostream> #define MEM(x) memset(x,0,sizeof(x)) using namespace std; const int maxn=50005; int ans; int rank[maxn],pa[maxn]; void make_set(int x){ pa[x]=x; rank[x]=0; } int find_set(int x) { int r = x,temp; while(pa[r] != r) r = pa[r]; while(x != r){ temp = pa[x]; pa[x] = r; x = temp; } return r; } /* int find_set(int x){ if(x!=pa[x]) pa[x]=find_set(pa[x]); return pa[x]; }*/ void union_set(int x,int y){ x=find_set(x); y=find_set(y); if(x==y) return ; ans--;//发现两人的根结点不同(题目中就代表信奉的宗教不 4000 同,ans--即可) if(rank[x]>rank[y]){ pa[y]=x; }else{ pa[x]=y; if(rank[x]==rank[y]) rank[y]++; } } int main(){ int n,t,i,kase=1; while(cin>>n>>t&&(n!=0||t!=0)){ for(i=1;i<=n;i++) make_set(i); //把每个点转换成一个集合 ans=n; int a,b; for(i=0;i<t;i++){ cin>>a>>b; union_set(a,b); } printf("Case %d: %d\n",kase++,ans); } return 0; }
相关文章推荐
- poj 2524(并查集 链表实现)
- POJ 2524-Ubiquitous Religions 并查集
- 【并查集】poj 2524 Ubiquitous Religions
- POJ-2524 Ubiquitous Religions(并查集)
- poj 2524_Ubiquitous Religions_并查集
- POJ 2524 宗教信仰 并查集 基础模板
- POJ训练计划2524_Ubiquitous Religions(并查集)
- poj 2524 Ubiquitous Religions——我感觉是并查集(分类是分治)
- poj 2524[并查集]
- poj 2524宗教信仰 并查集水题
- POJ 2524 Ubiquitous Religions 详细题解(并查集)
- POJ 2524 Ubiquitous Religions(并查集)
- poj 2524(并查集-求连通子集的个数)
- poj 2524-小白算法学习 并查集 Ubiquitous Religions
- POJ---2524-Ubiquitous Religions(并查集)
- POJ 2524 并查集
- poj 2524 Ubiquitous Religions(并查集)
- 并查集 POJ 2524
- 【POJ-2524】Ubiquitous Religions(并查集)
- POJ 2524 Ubiquitous Religions(简单并查集)