無向加權圖的最短距離
Shortest Distance in an Undirected Weighted Graph・dsa-13-01
- APCS 範圍外
- Bellman-Ford 與負環
- 資料結構與演算法・Shortest Path & MST
時間限制 2 秒・記憶體 64 MB
送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
題目敘述
某校園裡有 n 個地點,編號 1 到 n,其間有 m 條雙向小路,每條小路有一個通行時間。給定出發地點 s 與目的地點 t,請算出從 s 走到 t 所需的最短總時間。所有通行時間都不是負數,所以這是標準的單源最短路徑問題。若 t 無法從 s 走到,輸出 −1。
同一對地點之間可能有多條小路,此時應採用其中通行時間最小的那一條。
輸入格式
- 第 1 行:整數 n 與 m,表示地點數與小路數。
- 接下來 m 行:每行三個整數 u、v、w,表示 u 與 v 之間有一條雙向小路,通行時間為 w。
- 最後一行:整數 s 與 t,表示出發點與目的地。
輸出格式
輸出最短總時間(以有符號 64 位元整數表示)。若無法從 s 抵達 t,輸出 −1。
限制
- 1 ≤ n ≤ 50000
- 0 ≤ m ≤ O(n)(測試包含鏈狀與稠密情況)
- 1 ≤ w ≤ 109
- 圖為無向圖,同一對頂點間可能有平行邊,取權重最小者。
範例
範例 1
輸入
4 3
1 2 1
2 4 1
1 4 5
1 4輸出
2直接走 1−4 要 5,但 1 → 2 → 4 只要 1 + 1 = 2,所以答案是 2。
範例 2
輸入
1 0
1 1輸出
0起點與終點相同時,距離為 0,即使完全沒有邊。
範例 3
輸入
3 1
1 2 3
1 3輸出
-1地點 3 沒有任何小路相連,從 1 無法抵達。
範例 4
輸入
2 2
1 2 5
1 2 2
1 2輸出
21 與 2 之間有權重 5 與 2 兩條平行邊,應取較小的 2;若只用先讀到的那條會得到 5。
範例 5
輸入
4 3
1 2 1
2 3 2
1 4 5
4
1 4輸出
5s = 4、t = 1。只有一條路 4 − 1,耗時 5。讀完 m 條邊後,只有緊接著的兩個整數是 s 與 t,之後多餘的數字不使用。
範例 6
輸入
3 2
1 2 5
2 3 1
3
1 3輸出
6s = 3、t = 1,路徑 3 → 2 → 1 耗時 1 + 5 = 6。同樣只讀邊之後的前兩個整數作為 s、t。
說明
- 距離請用 64 位元整數儲存;O(n2) 的做法在大測資會逾時,建議使用優先佇列。
- 本題權重皆為正,不會出現負邊。
- 同一對頂點若讀到多條邊,只保留權重最小者,不是最後一條,也不是總和。
- 以優先佇列實作時,同一頂點可能留有多筆過期的較大距離,彈出後若該頂點已確定就略過。
送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。