poj 2524 Ubiquitous Religions 并查集
题意:给你n个学生和m对关系,每对关系表示这两个学生有同一个宗教信仰,求学校里最多有几种不同的宗教信仰。
分析:并查集,初始有n个几何,每次关系都把两个元素所在的集合合到一起。
View Code
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define re(i,n) for(int i=0;i<n;i++) #define re1(i,n) for(int i=1;i<=n;i++) #define ll long long const int maxn =50005; int p[maxn]; bool vis[maxn]; void init() { re(i,maxn) p[i] = i; } int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); } void Union(int x , int y) { int a = find(x) , b = find(y); p[a] = p[b] = p[x] = p[y] = min(a , b); } int n ; ll m; int main() { int cas = 1; while(~scanf("%d%lld",&n,&m) && n) { init(); while(m--) { int u,v; scanf("%d%d",&u,&v); if(find(u) != find(v)) { Union(u , v); n --; } } printf("Case %d: %d\n",cas++,n); } return 0; }