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;
}
posted @ 2012-07-05 04:19  lenohoo  阅读(125)  评论(0编辑  收藏  举报