簡體   English   中英

給定有一個負邊(u,v)的有向加權圖,找到最短路徑(s,t)

[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)

給定:有向加權圖G(V,E)和s,tV頂點,除邊(u,v)為負之外,所有邊均為正。

問題:找到從s到t的最短路徑( 含義:權重最小 )。

我的解決方案:嗯,因為我們有一個消極的邊緣,所以我們應該使用Bellman-Ford算法。 在邊緣執行n-1 “松弛”,如果在第n個迭代中存在問題,則存在一個循環-因此返回false。 否則,返回從st的最短路徑。

另一個解決方案:使用Dijkstra,並通過保存d(u)並在負邊緣(u,v)上傳遞並進行“松弛”來對其進行一些更改,然后在沒有負邊緣的情況下再次在所有邊緣上移動被改變,我們有一個循環,否則一切都好,返回最短的路徑。

注意:我顯然不確定我的解決方案,因為存在一個負面影響這一事實很棘手,有什么想法嗎?

注意2:為了使它有趣, 您不能使用Bellman-Ford

您可以使用存在單個負邊緣的信息來創建有效的算法。

讓我們表示作為a下降沿的源節點,和b目的節點,所以我們有下降沿a -> b

從節點s到節點t的路徑有兩種:

  1. 邊緣a->b不是路徑的一部分;
  2. 邊緣a->b是路徑的一部分。

我們打算找到從st的最短路徑,我們將通過找到上述兩種類型中的每一種的最短路徑來做到這一點。


沿着類型(1)的最小路徑可以通過簡單地將Dijkstra算法應用到刪除了負邊緣的修改圖形上來找到。


對於類型(2),我們現在對從st的最短路徑感興趣,該路徑包含邊a->b 該路徑必須采用以下形式: s -> ... -> a -> b -> ... -> t

如果圖中沒有負循環,則邊a->b應該在最短路徑中僅出現一次(請參見此答案的最后部分,以討論負循環)。

在這種情況下(沒有負循環),我們可以應用Dijkstra算法兩次,第一次找到最短路徑sa ; 然后找到從bt的最短路徑。 在這兩種情況下,都應將Dijkstra算法應用於通過刪除負邊a->b修改的圖。


關於負循環。 如果有開始和在同一節點中結束,並且具有負成本的負周期, 路徑,該節點是從路徑上st ,然后從最短路徑st不存在。 實際上,在這種情況下,通過多次包含負成本周期,可以使st的成本任意減小。

但是,可以再次使用Dijkstra算法確定圖形中是否存在這樣的循環。 請注意,由於存在單個負邊緣a->b ,因此負循環需要包含它。 因此,我們需要一條從ba的路徑,其總成本小於a->b的權重的絕對值。 我們可以通過應用Dijkstra的算法(起始節點為b ,目的地為a來檢查是否存在這樣的路徑。 同樣,Dijkstra的算法應在刪除了a->b邊的情況下應用於圖形(我們對將其放在路徑中不感興趣),因此所有邊權重均為正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM