用map实现并查集

一般并查集father都用数组,但在结点总数不知道,结点编号不连续的情况下不适用,可以用map

#include <cstdio>
#include <unordered_map>

using namespace std;

unordered_map<int, int> father;

int findFather(int v);
void unionSet(int i, int j);

int main(){
    
    
    int i, j;
    while(scanf("%d%d", &i, &j)!=EOF){
    
    
        unionSet(i, j);
    }
    int ans = 0;
    for(auto it=father.begin(); it!=father.end(); it++){
    
    
        if(it->first == it->second) ans++;
    }
    printf("%d", ans);
    return 0;
}

int findFather(int v){
    
    
    if(father.count(v)>0){
    
    
        int x = v;
        while(v != father[v]) v = father[v];
        while(x != v){
    
    
            int temp = father[x];
            father[x] = v;
            x = temp;
        }
    }
    else father[v] = v; //initialize a new node
    return v;
}

void unionSet(int i, int j){
    
    
    int fi = findFather(i), fj = findFather(j);
    if(fi != fj) father[fj] = fi;
    return;
}

猜你喜欢

转载自blog.csdn.net/sinat_37517996/article/details/105455654