算法笔记p322

代码:

#include <iostream>
#include <cstdio>
#include <set>
#define maxn 105
using namespace std;

int father[maxn];

int findfather1(int x){
    while(x != father[x]){
        x = father[x];
    }
    
    return x;
}

int findfather2(int x){
    if(x == father[x]) return x;
    else
        return findfather2(father[x]);
}

int findfather3(int x){
    int a = x;
    while(x != father[x]){
        x = father[x];
    }
    
    while(a != father[a]){
        int z = a;
        a = father[a];
        father[z] = x;
    }
    
    return x;
}

int findfather4(int x){
    if(x == father[x]) return x;
    else{
        int v = findfather4(father[x]);
        father[x] = v;
        return v;
    }
}

void Union(int a,int b){
    int fa = father[a];
    int fb = father[b];
    if(fa != fb)
        father[fa] = fb;
}


int main(void){
    freopen("in.txt","r",stdin);
    
    int n,m;
    set<int> vi;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        father[i] = i;
    
    while(m--){
        int a,b;
        scanf("%d%d",&a,&b);
        Union(a,b);
    }
        
    for(int i=1;i<=n;i++)
        vi.insert(findfather4(i));
    printf("%d
",vi.size());
    
    fclose(stdin);
    return 0;
}
原文地址:https://www.cnblogs.com/phaLQ/p/10466231.html