交互式图论学习
交互式图论学习
Guest User
Using app without sign in
割点查找器
找到移除后会增加连通分量的顶点
选择算法并生成步骤以开始可视化
割点(或关节点)是这样一个顶点:移除它会使图断开或增加其连通分量数。查找割点可识别网络中的单点故障。
Tarjan 基于 DFS 的方法访问每个顶点一次,跟踪其发现时间和 low-link 值,即从其子树经回边可达的最早被发现顶点。非根顶点 v 是割点,当某个子结点子树无法到达 v 之上,即 low[子结点] >= disc[v]。DFS 根顶点在拥有两个或更多 DFS 子结点时是割点。整个分析运行在 O(V + E)。
割点揭示通信网络中的关键路由器、道路系统中的关键路口、分布式基础设施中的脆弱服务器以及社交网络中有影响力的中介。可靠性工程用它来优先安排冗余。它们也与桥一起出现在更难的面试环节中。
一次深度优先搜索,每个结点两个数字。发现时间记录该结点第一次被看到的时刻;low-link 值记录它的子树经由一条回边所能抵达的最早结点。
dfs(u, 父结点):
disc[u] = low[u] = ++时间
孩子数 = 0
对 u 的每个邻居 v:
若 v == 父结点: 跳过
若 v 已访问:
low[u] = min(low[u], disc[v]) // 回边
否则:
孩子数++
dfs(v, u)
low[u] = min(low[u], low[v])
若 父结点 != 无 且 low[v] >= disc[u]:
标记 u 为割点
若 父结点 == 无 且 孩子数 > 1:
标记 u 为割点 // 根结点规则条件 low[v] >= disc[u] 表示以孩子 v 为根的子树没有任何一条回边能爬到 u 之上。因此离开该子树的每条通路都要经过 u,删掉 u 就会把它孤立出去。根结点是特例,因为它没有可被切断的父结点:根结点恰好在拥有两个或更多 DFS 孩子时才是割点,因为那些子树只能借由它彼此相通。
在一个由三角形加一条两结点尾巴构成的图上,从 A 出发执行 DFS,邻居按字母顺序选取。
示例图: 无向边 A-B、B-C、C-A 构成一个三角形,另有 C-D 与 D-E 悬挂其上。
割点是 C 和 D。三角形 A-B-C 在 A 与 B 中没有产生割点,因为环上的每个结点都有替代通路;而在尾巴 C-D-E 上,每个内部结点都是关键的。这个对比正是核心直觉:割点存在于链上,而不在环里。
时间: O(V + E) · 空间: O(V)
这是一次深度优先搜索,每条边只附加常数级的额外工作,因此代价与遍历本身相同。每个结点被访问一次,每条边从两个端点各被检查一次。额外状态是每个结点两个整数,即发现时间与 low-link,再加上递归栈,全都是 O(V)。朴素做法是逐个删去结点再检查连通性,代价为 O(V 乘以 (V + E)),因此 low-link 方法把一个平方级的检查压缩成了一次线性扫描。在一个有 10000 个结点、30000 条边的图上,这个差距大约是四个数量级。
割点、桥与双连通分量都源自同一次 DFS。具体用哪一个,取决于脆弱的是结点还是边。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 寻找桥 | 关键的是一条连接而非一个结点。同一次 DFS,只是把判据换成严格的 low[v] > disc[u]。 | O(V + E) |
| 双连通分量 | 你要的是删去任意单个结点后仍能存续的极大块,而不只是割点本身。 | O(V + E) |
| 点双连通性检查 | 你只需要一个是或否的答案:是否存在某个单点故障能让图断开。 | O(V + E) |
| Tarjan 强连通分量 | 图是有向的。割点这一概念只对无向图有定义。 | O(V + E) |