并查集判断无向图是否存在环

视频讲解:https://www.bilibili.com/video/BV13t411v7Fs?p=3&vd_source=df505e255a0c2e428b302beccab437c3

代码:

#include <string>
#include <unordered_set>
#include <iostream>
#include <algorithm>

std::vector<int> parent;
std::vector<int> rank;

int findRoot(int x) {
    int xRoot = x;
    while (parent[xRoot] != -1) {
        xRoot = parent[xRoot];
    }
    return xRoot;
}

// 返回 1: union successfully  返回 0: union failed
bool unionVertices(int x, int y) {
    int xRoot = findRoot(x);
    int yRoot = findRoot(y);
    if (xRoot == yRoot) {
        return false;
    }
    else {
        if (rank[xRoot] > rank[yRoot]) {
            parent[yRoot] = xRoot;
        }
        else if (rank[xRoot] < rank[yRoot]) {
            parent[xRoot] = yRoot;
        }
        else {
            parent[xRoot] = yRoot;
            rank[yRoot]++;
        }
        return true;
    }
    return false;
}

std::vector<int> findRedundantConnection(std::vector<std::vector<int>>& edges) {
    // 父节点全部初始化成 -1
    parent.assign(edges.size() + 1, -1);
    rank.assign(edges.size() + 1, 0);

    for (int i = 0; i < edges.size(); i++) {
        int x = edges[i][0], y = edges[i][1];
        if (!unionVertices(x, y)) {
            return edges[i];
        }
    }
    return std::vector<int>(2, 0);
}

int main() {
    std::vector<std::vector<int>> edges = { {1, 2}, {2, 3}, {1, 3} };
    std::vector<int> res = findRedundantConnection(edges);
    std::cout << res[0] << " " << res[1] << std::endl;
    return 0;    
}

 

posted @ 2023-02-28 21:30  风影旋新月  阅读(40)  评论(0编辑  收藏  举报