基于数组实现并查集

//
// Created by zhengwei.
//
#include <iostream>
#include <vector>
#include <set>

#define maxn 100
using namespace std;

vector<int> parent(maxn);
//初始化:全部是独立节点
void init() {
    for (int i = 0; i < maxn; ++i) {
        parent[i] = i;
    }
}

int find(int x) {
    if (parent[x] == x)return x;//到顶
    set<int> path;//记录路径上经过的点
    while (parent[x] != x){
        path.insert(x);
        x = parent[x];
    }
    set<int>::iterator iter = path.begin();
    for (; iter!=path.end() ; ++iter) {
        parent[*iter]=x;
    }//全部指向最顶节点
    return x;
}

void merge(int x,int y){
//y的父亲指向x的父亲,现在它们在一棵树上
    parent[find(y)]=find(x);
}

int main(int argc, const char * argv[]) {
    init();
    merge(3,10);
    merge(3,9);
    merge(9,8);
    cout<<parent[3]<<endl;
    cout<<parent[8]<<endl;
    cout<<parent[9]<<endl;
    cout<<parent[10]<<endl;
    return 0;
}

发布了127 篇原创文章 · 获赞 96 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zhengwei223/article/details/87366839
今日推荐