有向无权图删边最短路 (Roditty, Zwick, 2005)

给定一有向无权图 \(G\) 和起点终点 \(s,t\), 对每条边 \(e\), 计算 \(G \smallsetminus \{e\}\)\(s\)\(t\) 的最短路.

(注意: 无向图上的那个经典算法在有向图上是错误的.)

我们先求出一条 \(s\)\(t\) 的最短路, 显然, 我们只需要考察这条路径上每条边被删去的时候的最短路.

对于删去一条边的路径, 考虑将新的最短路和原来的最短路进行比较, 显然我们只需要"离开"原来的最短路一次, 而且形如: 记原来的最短路为 \(p_1,\dots,p_k\), 那么新的最短路在 \(p_i\) 处离开, 在 \(p_j\) 处重新回来, 且 \(i<j\).

考虑设置阈值 \(L\), 当 \(p_i\)\(p_j\) 的这条外部路径的长度超过或不超过 \(L\) 的时候, 我们分开处理.

注意到从 \(p_i\)\(p_j\) 的一条外部路径长度一定不小于 \(j-i\), 我们可以一次性处理所有 \(i\bmod (L+1)\) 为同一个值作为起点的 \(i\). 从它们开始做多源 最短路的 BFS, 可以在 \(O(m)\) 的时间内得到到每个点的对应的外部路径长度. 如果长度 \(>L\) 说明实际上到它最近的 \(i\) 没法走到它. 然后可以在 \(O(n)\) 时间内更新每条边的答案.

这部分复杂度 \(O(mL)\).

随机选一个点, 考虑用经过它的外部路径来更新答案. 只需要做正反图上的 BFS 以及前缀后缀 min 就能 \(O(m)\) 更新.

由于我们考虑的都是 \(>L\) 的路径, 所以每条路径有 \(\geq L/n\) 的概率命中. 随机 \(n/L\) 次, 就只有 \((1-L/n)^{n/L} \leq 1/e\) 的概率失败. 因此, 总共随机 \(k\ln n\cdot n/L\) 次, union bound 就保证了有 \(\geq 1 - \frac 1{n^{k-1}}\) 的概率成功计算出所有答案.

因此, 这部分的代价是 \(O(mn/L \cdot \log n)\).

清算

综上, 我们在 \(O\left(m\sqrt{n\log n}\right)\) 的时间内解决.

posted @ 2022-07-09 18:04  EntropyIncreaser  阅读(1814)  评论(4编辑  收藏  举报