1. 程式人生 > 其它 >[做題記錄-圖論] [NEERC2017]Journey from Petersburg to Moscow [關於處理路徑前$k$大的一種方法]

[做題記錄-圖論] [NEERC2017]Journey from Petersburg to Moscow [關於處理路徑前$k$大的一種方法]

題意

給定一張連通無向簡單圖 \(G\),每條邊有一個邊權。
給定正整數 \(k\),你需要找到 \(G\) 的一條從 \(1\)\(n\) 的路徑,設該路徑的長度為 \(l\),你需要使得這條路徑中邊權前 \(\min \left\{ k, l \right\}\) 大的邊的邊權總和儘可能小。

題解

這種玩意看著人傻了, 一點想法沒有, 瞟了下yhx的題意下面幾行發現好像是減什麼東西才有想法

考慮列舉一條邊作為第\(k\)大, 那麼如果把所有的邊減去這個\(w_k\)並對\(0\)\(\max\), 然後如果把權補回來, 那麼就求出了一條合法的路徑。

考慮直接大力列舉每條邊和初始不變的情況計算, 那麼\(Ans = \min_{w_k}\{Dis_{n} + k \times w_k\}\)

下面考慮證明這個事情。

\(l\)表示答案的路徑長度。

  • \(l \geq k\)
    • 如果路徑上有\(> k\)條變化後有權值的邊,那麼當前答案會\(\geq ans\)。因為多出來的邊應該不算。
    • 如果路徑上有\(\leq k\)條變化後有權值的邊,那麼當前答案會\(\geq ans\)。因為多加了。
    • 噹噹前列舉的\(w\)恰好是答案路徑的\(w_k\)時, 當前答案就是\(ans\), 所以正確。
  • \(l < k\)
    • \(w = 0\)的時候答案正確。

綜上可以發現在沒有取到答案的時候我們的做法會使答案變大, 恰好取到的時候會是答案, 直接最短路即可。