龜兔賽跑簡要題解

先把 \(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)\) 就足夠了

Select a repo