[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?
[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)
給定:有向加權圖G(V,E)和s,t
是V
頂點,除邊(u,v)
為負之外,所有邊均為正。
問題:找到從s到t的最短路徑( 含義:權重最小 )。
我的解決方案:嗯,因為我們有一個消極的邊緣,所以我們應該使用Bellman-Ford算法。 在邊緣執行n-1
“松弛”,如果在第n
個迭代中存在問題,則存在一個循環-因此返回false。 否則,返回從s
到t
的最短路徑。
另一個解決方案:使用Dijkstra,並通過保存d(u)並在負邊緣(u,v)上傳遞並進行“松弛”來對其進行一些更改,然后在沒有負邊緣的情況下再次在所有邊緣上移動被改變,我們有一個循環,否則一切都好,返回最短的路徑。
注意:我顯然不確定我的解決方案,因為存在一個負面影響這一事實很棘手,有什么想法嗎?
注意2:為了使它有趣, 您不能使用Bellman-Ford 。
您可以使用存在單個負邊緣的信息來創建有效的算法。
讓我們表示作為a
下降沿的源節點,和b
目的節點,所以我們有下降沿a -> b
。
從節點s
到節點t
的路徑有兩種:
a->b
不是路徑的一部分; a->b
是路徑的一部分。 我們打算找到從s
到t
的最短路徑,我們將通過找到上述兩種類型中的每一種的最短路徑來做到這一點。
沿着類型(1)的最小路徑可以通過簡單地將Dijkstra算法應用到刪除了負邊緣的修改圖形上來找到。
對於類型(2),我們現在對從s
到t
的最短路徑感興趣,該路徑包含邊a->b
。 該路徑必須采用以下形式: s -> ... -> a -> b -> ... -> t
。
如果圖中沒有負循環,則邊a->b
應該在最短路徑中僅出現一次(請參見此答案的最后部分,以討論負循環)。
在這種情況下(沒有負循環),我們可以應用Dijkstra算法兩次,第一次找到最短路徑s
到a
; 然后找到從b
到t
的最短路徑。 在這兩種情況下,都應將Dijkstra算法應用於通過刪除負邊a->b
修改的圖。
關於負循環。 如果有開始和在同一節點中結束,並且具有負成本的負周期, 即路徑,該節點是從路徑上s
到t
,然后從最短路徑s
到t
不存在。 實際上,在這種情況下,通過多次包含負成本周期,可以使s
到t
的成本任意減小。
但是,可以再次使用Dijkstra算法確定圖形中是否存在這樣的循環。 請注意,由於存在單個負邊緣a->b
,因此負循環需要包含它。 因此,我們需要一條從b
到a
的路徑,其總成本小於a->b
的權重的絕對值。 我們可以通過應用Dijkstra的算法(起始節點為b
,目的地為a
來檢查是否存在這樣的路徑。 同樣,Dijkstra的算法應在刪除了a->b
邊的情況下應用於圖形(我們對將其放在路徑中不感興趣),因此所有邊權重均為正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.