并查集判断无向图是否存在环
视频讲解: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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现