基于 Tarjan 递归深度树判定,通过 $low[v] \ge dfn[u]$ 极速探测网络的物理关键节点与桥梁
在一张无向连通图 $G = (V, E)$ 中:
基于 DFS 深度优先搜索树中顶点的 dfn[u] 和 low[u] 关系:
int dfn[MAXN], low[MAXN], timer = 0;
bool is_cut[MAXN]; // 记录是否为割点
vector<pair<int,int>> bridges; // 记录桥边
void tarjan(int u, int p = -1) {
dfn[u] = low[u] = ++timer;
int children = 0;
for (int v : g[u]) {
if (v == p) continue; // 忽略直接父边
if (!dfn[v]) {
children++;
tarjan(v, u);
low[u] = min(low[u], low[v]); // 子节点回溯
// 1. 非根割点判定条件
if (p != -1 && low[v] >= dfn[u]) is_cut[u] = true;
// 2. 桥判定条件
if (low[v] > dfn[u]) bridges.push_back({u, v});
} else {
low[u] = min(low[u], dfn[v]); // 返祖边更新
}
}
// 3. 根节点割点判定条件:拥有至少2棵独立子树
if (p == -1 && children > 1) is_cut[u] = true;
}