![](/img/trans.png)
[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)
[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?
以下是我正在研究的問題:
考慮一個有向加權圖G ,其中所有邊緣權重均為正。 這個問題的目的是在兩個預先指定的頂點s和t之間找到G的最短路徑,但要增加一點扭曲:允許將(選擇的)一條邊的權重更改為零。
換句話說,您必須在G中選擇一個邊沿以將其設置為零,以最小化s和t之間的最短路徑。 給出一種有效的算法,以在O(E lg V)時間內實現此目標,並分析算法的運行時間。 次優解決方案將獲得較少的信譽。
提示:您可能需要反轉邊緣,多次運行熟悉的算法,並做一些額外的工作
所以,我試圖運行從s Dijkstra的所有其他節點,然后我試圖逆轉的邊緣,從s再次運行到所有其他節點。 但是,我發現我們必須將Dijskstra從s運行到所有其他節點 ,然后反轉邊,然后再將Dijkstra從所有其他節點運行到t 。 我不確定這如何幫助我們找到要設置為零的邊。 根據我的直覺,我認為我們可以將最大重量邊設置為零。 反轉邊緣的意義何在?
我們需要運行Dijkstra的算法兩次-一次是使用s
作為源頂點的原始圖,一次是使用反向圖並且t
作為源頂點的圖。 我們將表示從第一次運行得到的頂點s
和i
之間的距離為D(i)
,從第二次運行得到的頂點t
與i
之間的距離為D_rev(i)
。
請注意,我們可以向后跟隨反向邊(即,沿原始方向跟隨它們),因此D_rev(i)
實際上是從頂點i
到t
的最短距離。 同樣, D(i)
是遵循Dijkstra算法的從頂點s
到i
的最短距離。
現在我們可以遍歷所有邊緣,對於連接v1
和v2
每個邊緣e
,將D(v1)
和D_rev(v2)
,這對應於路徑s -> v1 -> v2 -> t
的權重s -> v1 -> v2 -> t
D_rev(v2)
s -> v1 -> v2 -> t
以e
為零邊,因為我們可以從s
到v1
且距離為D(v1)
,所以將e
設置為0,從v1
到v2
,然后從v2
到t
的距離為D_rev(v2)
。 這些最小的答案。
粗略的證明草圖(以及重述):如果將邊e
設置為0,但不在路徑中使用它,則最好將路徑中的邊設置為0。因此,我們只需要考慮包括歸零邊緣的路徑。 通過零邊e
的最短路徑是首先采用從s
到v1
的最短路徑,然后采用從v2
到t
的最短路徑,這正是使用Dijkstra算法(即D
和D_rev
計算D_rev
。
希望這個答案有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.