下面是對您找到的算法如何處理您的示例問題的解釋。
問題是要找到node one
和node four
之間的最短路徑,並且額外的條件是沿途的累計成本不應超過7
。
我們想要找到的解決方案是首先從node one
到節點node two
,距離爲190
,代價爲4
。然後使用距離195
和成本3
的路徑從node two
到node four
。總共路徑的距離爲385
,成本爲7
。
步驟1
那麼如何算法找到這個?第一步就像你所做的那樣設置矩陣minArray(i,j)
。數組中的元素(i,j)
包含您必須前往節點j
並保持i
剩餘金額的距離。
起步沒有訪問元素和,因爲我們已開始在node one
與7
「資金」左上角元素設置爲零。上表中的空白空間對應於數組中設置爲infinity
的值。
步驟2
接下來,我們發現在陣列的最低值,這是在(remaining money, node) = (7,1)
位置零。此元素設置爲visited
(使用與minArray
相同大小的矩陣visitedArray
跟蹤元素的狀態),這意味着我們已選擇node one
。現在,所有連接到node one
的節點都會通過遍歷相應的邊來更新值。
這裏minArray(6,3) = 191
這意味着我們已經走了的191
的距離去node three
,我們已經離開了錢6
因爲我們所許的1
成本到那裏。以同樣的方式,minArray(3,2)
設置爲190
。紅色方塊表示訪問元素(7,1)
。
步驟3
現在,我們再次找到最低的未訪問的元素(這是minArray(3,2) = 190
),將其設置爲visited
和更新連接到它的所有元素。這意味着距離是累積的,剩餘的錢是通過從當前值中減去成本來計算的。
注意,實在是太貴了,從node two
回去node one
。
步驟4
下一步,選擇minArray(6,3) = 191
看起來像這樣。
步驟5
三個步驟後來陣列看起來像這樣。這裏選擇了等於382
和等於383
的兩個元素。請注意,如果元素的值是當前值的改進(即低於),則元素的值纔會更新。
步驟6
陣列繼續進行,直到所有元件被訪問的任一或仍然具有無限值填補。
最後步驟
的最終步驟是通過找到4列的最低值來查找的總距離。我們可以看到最小值minArray(0,4) = 385
對應於正確的解決方案。
注:如果四個列的所有值都將是無限的,那豈不是沒有有效的解決方案。該算法還規定,如果在列4中存在多個相等和最小距離的值,則選擇最便宜的一個。
平行邊緣不會破壞Dijkstra,但附加條件會。 –
這是一個確切的重複,但原來的問題沒有解決方案 - 只有一個解決方案存在於其他地方的聲明(以及SPOJ中的815個人找到了一個)。 – LSerni
這是*不是*完全重複 - 另一個問題甚至沒有提到在一對節點之間可能存在兩條或更多路徑的可能性,也沒有提到附加條件附加到下襬的可能性。 –