并查集判断无向图是否存在环
视频讲解: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; }