poj 2524 Ubiquitous Religions

点击打开链接poj 2524


思路:简单的并查集

分析:输入的时候把相同集合的元素合并在一起,那么我们用一个vis数组来标记集合根节点是否出现过。比如某个几个的根节点为5,那么就把vis[5] = 1。这样最后我们只需要

枚举一变所有的点,把最后有个根节点求出来就是最大的集合数量


代码:


#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 50010;

int father[MAXN];

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

int find(int x){
    if(father[x] != x)
        father[x] = find(father[x]);
    return father[x];
}

void solve(int x , int y){
    int fx = find(x);
    int fy = find(y);
    if(fx != fy)
       father[fx] = fy;
}

int main(){
    int cas = 1;
    int n , m;
    int x , y;
    while(scanf("%d%d" , &n , &m) && n+m){
        init(n);
        while(m--){
            scanf("%d%d" , &x , &y); 
            solve(x , y);
        }
        set<int>s;
        for(int i = 1 ; i <= n ; i++)
            s.insert(find(i));
        printf("Case %d: %d\n" , cas++ , s.size());
    }
    return 0;
}



你可能感兴趣的:(poj 2524 Ubiquitous Religions)