→ a58524andy: 你的dijkstra好像有點…特別(?06/13 19:34
→ a58524andy: 要更新的點不是只有無限遠的06/13 19:37
→ darrenlee1: 對 但我一開始都設成無限遠06/13 19:38
推 firejox: 同一樓,你這不是Dijkstra06/14 13:35
→ firejox: 簡單反例是ABC三點皆相鄰,起點A終點C,AC > AB + BC06/14 13:39
→ darrenlee1: 但我每次都是目前能延伸最短的路徑,假如AC>AB>BC 最06/14 14:11
→ darrenlee1: 短路徑不會是AC這條邊06/14 14:11
→ a58524andy: 測資有zero edge,假設現在兩點A B跟Source都是1006/14 14:19
→ a58524andy: 同時AC = 1、BC = 0,你的queue剛好先掃A的話06/14 14:19
→ a58524andy: 那麼C不會被更新成S -> B -> C這個距離1006/14 14:20
→ a58524andy: 而是會卡在S -> A -> C這個1106/14 14:20
→ a58524andy: *並且假設AB=006/14 14:20
→ a58524andy: 恩我在說甚麼@@ 這跟zero edge也沒什麼關係06/14 14:23
→ a58524andy: 總之當SA=SB=10、AC=m、BC=n、queue剛好先選A來跑 06/14 14:25
→ a58524andy: 並且m>n的時候06/14 14:25
→ a58524andy: 這個寫法應該會出事06/14 14:25
→ chengweihsu: 感覺是input處理有問題,他好像沒說頂點間的邊數<=106/14 15:07
→ chengweihsu: 你用adjacent matrix存邊的權重,如果同一對頂點06/14 15:07
→ chengweihsu: (u,v)有>=兩條邊,你只會紀錄最後輸入的那條,但那06/14 15:07
→ chengweihsu: 條可能比之前記的w[u][v]還大,這樣你等於是在錯的06/14 15:07
→ chengweihsu: 圖上跑dijkstra06/14 15:07
→ a58524andy: 測了一下,樓上應該是對的 06/14 15:32
→ darrenlee1: 他有重複的邊的話我應該把他都加起來在跑dijktra 嗎06/14 20:15
→ darrenlee1: 我改成用+= 還是有點問題欸 還是是我理解有問題06/14 20:24
→ darrenlee1: 我有先清成006/14 20:25
→ darrenlee1: 回一下a大,我是用pq每次會幫我把最小的pop out出來,06/14 20:30
→ darrenlee1: 所以一開始push (SA 10)(SB 10) 先把SA,pop out出來06/14 20:30
→ darrenlee1: 後會push(AC 10+m),所以接下來pop out的會是SB,因06/14 20:30
→ darrenlee1: 此m<n也不會有問題06/14 20:30
→ chengweihsu: 有重複邊的話你處理input時,要多加條件判斷而不是06/14 20:55
→ chengweihsu: 加起來,因為你最短路徑一定是選所有連接(u,v)的邊06/14 20:55
→ chengweihsu: 中最短的06/14 20:55
→ chengweihsu: 若路徑包含(u,v)這兩點06/14 20:56
→ darrenlee1: 謝謝~過了06/14 21:00
→ darrenlee1: 謝謝大家的幫忙06/14 21:00
※ 編輯: darrenlee1 (220.141.64.159 臺灣), 06/14/2020 21:02:02