略譯

原題目連結

給一有向圖,每條邊有權重,
在每一個點放一隻老鼠,指定終點,
假設每隻老鼠知道任兩點間最短路徑,且被訓練成只走最短路徑,
問時間 T 以內能到達終點的老鼠有幾隻

題解

很顯然的最短路徑問題,且點的個數最多到 100
每隻老鼠以最短路徑走到終點,等同於求所有點到終點的最短路徑
最後問你有幾個點離終點的距離 <= T

由於點不多,可以用實作最簡單快速,但複雜度高達 n^3floyd-warshall 算法,
一樣可以跑到 0.000

追求降低複雜度的話…

我們需要在有向圖上求 所有點 => 終點E 的距離

每一個點到終點 E 的最短路徑,透過 Dijkstra 也得要 n log n + m
所以會變成 n * (n log n + m)

但終點只有一個,如果我們倒回來求 終點 => 所有點 的距離呢?

雖然 終點 => 所有點 的距離不等於 所有點 => 終點 的距離

但如果我們把任一點 p 到達終點 E 的路徑上的邊全數反轉
我們就可以用相同時間從終點 E 走回點 p

因此,我們可以將所有的邊反向,題目就轉成求 終點E => 所有點 的最短路徑問題

就可以只用一次 Dijkstra 花費 n log n + m 的時間解決

實作提示

  • 小心 E => E
  • 小心那些根本沒有 path 能走到 E 的點