[題解] UVa 1112 - Mice and Maze
Tags
- 題解
- UVa
- D難度
略譯
給一有向圖,每條邊有權重,
在每一個點放一隻老鼠,指定終點,
假設每隻老鼠知道任兩點間最短路徑,且被訓練成只走最短路徑,
問時間 T 以內能到達終點的老鼠有幾隻
題解
很顯然的最短路徑問題,且點的個數最多到 100;
每隻老鼠以最短路徑走到終點,等同於求所有點到終點的最短路徑,
最後問你有幾個點離終點的距離 <= T
由於點不多,可以用實作最簡單快速,但複雜度高達 n^3 的 floyd-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 的點
cmusu