# 龜兔賽跑簡要題解 先把 $S-T$ 的最短路先求出來然後我們叫這條路徑為 $P$ 你現在就只在乎把 $P$ 上面拔掉後的最短路是多少 為了方便先假設全點對最短路唯一 假設我們用個資料結構 維護一下 把$P$上第 $i$ 個點拔掉後的最短路 定義 $F(X)$ 為 走 $S\to X$ 最短路 會經過 $P$ 上最後面的一個點 $FD(X)$ 為 $S\to X$ 最短路長度 定義 $G(X)$ 為走 $T\to X$ 最短路 會經過 $P$ 上最前面的一個點 $GD(X)$ 為 $X\to T$ 最短路長度 那考慮以下三種狀況 1. $S\to A\to B\to T$ 此時 $S\to A$ 會走最短路 且 $B\to T$ 會走最短路 並且 $A-B$ 恰為一條邊 如果我們直接枚舉 $A, B$ 那這時候就可以更新 $(F(A), G(B))$ 區間為 $len(A, B) + FD(A) + GD(B)$ 2. $S\to A\to T$ 此時 $S\to A$ 會走最短路 且 $A\to T$ 會走最短路 那這時候可以更新 $(F(A), G(A))$ 區間為 $FD(A) + GD(A)$ 3. 最後一個比較特別的狀況 考慮現在拔掉 $P$ 上第 $y$ 個點 那你發現唯一剩下的 case 就是 $S\to A$ 走不經過 $y$ 最短路 $A\to T$ 走不經過 $y$ 最短路 然後考慮 $F(A) = y, G(A) = y$ 那就想辦法把所有點都跑去跑個最短路 對於 $i$ 得到 $S\to i$ 不經過 $F(i)$, 的最短路 和 $i\to T$ 不經過 $G(i)$ 的最短路 就可以解決這個 case ----------------------- 以下是證明為什麼 case 1, 2, 3 就會包含全部的 case 考慮候選路徑 $Q$ 為一條可能為最後答案的路徑 為了方便順便把點重新編個號 在 $P$ 上面第 $i$ 個點就改成編號 $i$ 所以 $S$ 的編號是 $1$, $T$ 的編號是 $|P|$ 並假設 $Q$ 是在拔掉 $y$ 點狀況下的候選路徑 那考慮邊 $(a, b)$ 為 $Q$ 上第一條非 以$S$為源點 的最短路徑樹上的邊 以及邊 $(c, d)$ 為 $Q$ 倒數第一條非 以T為源點 的最短路徑樹上的邊 那如果 $(a, b)$ 不存在的話 case 1 會處理到 這時候有些性質是可以用的 1. $F(b) \geq y$ 因為如果 $F(b) < y$ 那就沒什麼理由要走 $(a, b)$ 直接走 $S\to b$ 最短路再說就好 2. $G(c) \leq y$ 同理 3. $F(x) \leq G(x)$ 如果沒有的話會矛盾 那如果 $F(b) > y$ 或是 $G(c) < y$ 就會發現 case 1 會處理到 所以接下來只剩下 $F(b) = G(c) = y$ 而且 對於所有 $u$ 在路徑 $b-c$ 上面都會滿足 $F(u) = G(u) = y$ 的 case 不然就會被 case 1 處理到 那這個 case 就會在 case 3 被處理掉 ---- 最後就是在如果沒有 "全點對最短路唯一" 的狀況 唯一不同的是 $F(X)$ 變成了一個 set, $G(X)$ 也是 那這時候就發現 留下最小的 $F(X)$, 最大的 $G(X)$ 就足夠了