删边最短路
前言
删边最短路是一种科技,用于解决一类问题:
给定非负权图 \(G = (V, E)\)。设 \(n = |V|\),保证 \(1\) 可达 \(n\)。
设 \(\Delta(e)\) 为图 \(G' = (V, E \setminus \{e\})\) 上 \(1 \rightsquigarrow n\) 的最短路,若 \(G'\) 上 \(1\) 不可达 \(n\) 则为 \(+\infty\)。
对每个 \(e \in E\),求出 \(\Delta(e)\)。
点的编号不影响什么,源点和终点可以随便给,这里给 \(1\) 和 \(n\) 是为方便。
我将删边最短路称为科技,是因为删边最短路的整个流程逻辑链相对复杂,难以想到,重在积累。
所以本文只会描述删边最短路科技的过程以及必要的证明,而不会阐述一些东西是怎么想到的。
前置知识:最短路树的定义与构建。
本文中 \(w(e)\) 代表边 \(e\) 的权值,\(w(u, v)\) 代表 \((u, v)\) 这条边的权值,\(w(P)\) 代表路径 \(P\) 的权值。
同时请注意“最短路”和“最短路径”的差别,前者指的是长度,后者指的是路径。
无向图
即保证 \(G\) 是无向的。
这里再加一个限制条件:\(G\) 是联通图,可以简化讨论。
\(G\) 不是联通图的情况,显然除了 \(1\) 和 \(n\) 所在联通块,其他联通块可以直接忽略。
前提记号
设 \(G\) 的以 \(1\) 为根的任意一棵最短路树 \(T\),并从 \(T\) 上找到 \(1 \rightsquigarrow n\) 的路径,设为 \(P\)。
注意,\(1 \rightsquigarrow n\) 的最短路径可能有很多,这里 \(T\) 上的那条 \(1 \rightsquigarrow n\) 的路径和 \(P\) 必须是原图上同一条最短路径。
设 \(P = p_0(=1) \xrightarrow{E_1}p_1 \xrightarrow{E_2}p_2\xrightarrow{E_3}\cdots\xrightarrow{E_k}p_k(=n)\),\(V_P = \{p_i\}\),\(E_P = \{E_i\}\),\(D = w(P) = \sum E_i\)。
显然,从 \(T\) 上选出的 \(1 \rightsquigarrow n\) 最短路径一定是简单的(不包含零环),因此上面的 \(p_i\),\(E_i\) 都互不相同。
原图上 \(1 \rightsquigarrow u\),以及 \(u \rightsquigarrow n\) 之间可能有许多条最短路径,那么这里我们规定:
- 给定 \(u\),对于 \(1 \rightsquigarrow u\) 的最短路径,指的是 \(T\) 上 \(1 \rightsquigarrow u\) 这段路径代表的最短路径,设为 \(P(1, u)\)。
- 给定 \(u\),对于 \(u \rightsquigarrow n\) 的最短路径,指的是 \(T\) 上 \(u \rightsquigarrow n\) 这段路径代表的最短路径。设为 \(P(u, n)\)。
- 同时,设 \(D(1, u) = w(P(1, u))\),\(D(u, n) = w(P(u, n))\)。
- 于是事实上,\(P\) 可以看做 \(P(1, n)\) 的简写;\(D\) 可以看做 \(D(1, n)\) 的简写。
另外,对于任意 \(u \in V_P\),记 \(u\) 在 \(p\) 上的下标为 \(\mathrm{id}(u)\)。即,\(p_{\mathrm{id}(u)} = u\)。
引理
\(\mathbf{Lemma\ 1}\) 对于任意 \(\boldsymbol{e \not\in E_P}\),\(\boldsymbol{\Delta(e) = D}\)。
删除 \(e\) 不会影响最短路径 \(P\),也不可能凭空生成一条距离更小的路径,因此 \(1\) 到 \(n\) 的最短路仍然是 \(D\)。
这个引理告诉我们,只需关心 \(e \in E_P\) 的 \(\Delta(e)\) 即可。
\(\mathbf{Lemma\ 2.1}\) 对于任意 \(\boldsymbol {u \ne v}\),\(\boldsymbol{P(1, u)}\) 和 \(\boldsymbol{P(1, v)}\) 只会共享一段前缀(可以只有 \(\boldsymbol 1\) 一个点),然后走互不相交的道路。
\(\mathbf{Lemma\ 2.2}\) 对于任意 \(\boldsymbol{u \ne v}\),\(\boldsymbol{P(u, n)}\) 和 \(\boldsymbol{P(v, n)}\) 只会共享一段后缀(可以只有 \(\boldsymbol n\) 一个点),之前一定走互不相交的道路。
\(\mathbf{Lemma\ 2.3}\) 对于任意 \(\boldsymbol{0 \le i \le k}\),\(\boldsymbol{P(1, p_i)}\) 是 \(\boldsymbol P\) 的一段前缀,\(\boldsymbol{P(p_i, n)}\) 是 \(\boldsymbol P\) 的一段后缀。
\(P(1, u)\),\(P(1, v)\),\(P(u, n)\),\(P(v, n)\) 都是从最短路树上摘出来的。
根据树的性质,自然有 \(1\) 到 \(u\) 的路径和 \(1\) 到 \(v\) 的路径只共享一段前缀,然后分叉。\(u\) 到 \(n\) 的路径和 \(v\) 到 \(n\) 的路径同理。
第三条是因为在 \(T\) 上,\(p_i\) 在 \(1\) 和 \(n\) 之间的链上。
\(\mathbf{Lemma\ 3.1}\) 一条最短路径的任意一段子路径,也是一条以这条子路径两端为源点和终点的最短路径。
一条最短路径 \(P'\) 的任意子路径 \(Q\) 也是一条最短路径。否则,若存在长度比 \(Q\) 短(且源点终点相同)的另一路径 \(Q'\),则 \(P’\) 可以将自身的子路径 \(Q\) 替换为 \(Q'\) 从而生成更短的路径,与 \(P'\) 是最短路径矛盾。
\(\mathbf{Lemma\ 3.2}\) 对于 \(\boldsymbol{e \in E_P}\),删除 \(\boldsymbol e\) 后,\(\boldsymbol 1\) 到 \(\boldsymbol n\) 若可达,则存在一条 \(\boldsymbol 1\) 到 \(\boldsymbol n\) 的简单最短路径,满足该路径从 \(\boldsymbol 1\) 开始,先跟 \(\boldsymbol P\) 共享一段前缀(可以只有 \(\boldsymbol 1\) 一个点),然后腾空一段绕过 \(\boldsymbol e\)(期间与 \(\boldsymbol P\) 无交),最后和 \(\boldsymbol P\) 共享一段后缀(可以只有 \(\boldsymbol n\) 一个点)到达 \(\boldsymbol n\)。
删除 \(e\) 后 \(1\) 仍可达 \(n\),则随便生成一条最短路径 \(Q'\)(若可达,则一定存在最短路径)。
考虑删除 \(Q'\) 上的全部零环,就可以