推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

用并查集检测无向图连通性的过程

更新时间:2026-10-17 12:41:39 大小:38K 上传用户:他山之石可攻玉查看TA发布的资源 标签:并查集无向图连通性Union-FindFindUnion 下载积分:2分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

用并查集检测无向图连通性的过程 并查集(Union-Find)是检测无向图连通性的高效数据结构,它能动态维护"元素所属集合"并判断两点是否连通。本文从问题定义出发,详细剖析并查集检测连通性的过程。 问题定义 给定一个无向图,判断任意两个顶点是否连通(是否存在一条路径相连)。并查集能在动态加边后快速回答连通性查询。 顶点: 1,2,3,4,5边: 1-2, 2-3, 4-51与3连通(1-2-3),1与4不连通 并查集的核心思想 并查集把每个集合组织成一棵树,树根作为"代表元素"。两个操作: 查找(Find):找某元素所在集合的根。 合并(Union):把两个集合合并。 判断两点是否连通,即判断它们的根是否相同。 基本实现 c#include

#define MAXN 1005int parent[MAXN];void init(int n) { for (int i = 1; i <= n; i++) parent[i] = i;}int find(int x) { return parent[x] == x ? x : find(parent[x]);}void unite(int a, int b) { parent[find(a)] = find(b);}// 判断两点是否连通int connected(int a, int b) { return find(a) == find(b);} 优化:路径压缩与按秩合并 朴素实现中,树可能退化成链,导致查找 。通过两种优化可达到近常数复杂度: 路径压缩:查找时把路径上节点直接指向根。 按秩合并:合并时把小树接到大树上。 cint find_path(int x) { return parent[x] == x ? x : parent[x] = find_path(parent[x]); // 路径压缩}void unite_rank(int a, int b, int *rank) { int ra = find_path(a), rb = find_path(b); if (ra == rb) return; if (rank[ra] < rank[rb]) { parent[ra] = rb; } else { parent[rb] = ra; if (rank[ra] == rank[rb]) rank[ra]++; }} 复杂度分析 朴素实现:最坏 (树退化成链)。 路径压缩 + 按秩合并:单次操作 ,其中 是反阿克曼函数,对任何实际规模的 近似常数,可视为 。 应用场景 并查集检测连通性广泛应用于: 动态连通性:网络节点动态连接,快速查询。 最小生成树(Kruskal):判断加入边是否形成环。 等价类划分:把元素归入同一类别。 小结 并查集通过"查找根 + 合并集合"维护动态连通性,判断连通只需比较两点的根。路径压缩与按秩合并使操作近常数。掌握并查集的核心思想与优化,是处理动态连通性、最小生成树等问题的基础。

部分文件列表

文件名 大小
用并查集检测无向图连通性的过程.docx 38K

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载