簡體   English   中英

為了找到最短路徑,如何在有向加權圖中將一個邊精確設置為零?

[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?

以下是我正在研究的問題:

考慮一個有向加權圖G ,其中所有邊緣權重均為正。 這個問題的目的是在兩個預先指定的頂點st之間找到G的最短路徑,但要增加一點扭曲:允許將(選擇的)一條邊的權重更改為零。

換句話說,您必須在G中選擇一個邊沿以將其設置為零,以最小化st之間最短路徑。 給出一種有效的算法,以在O(E lg V)時間內實現此目標,並分析算法的運行時間。 次優解決方案將獲得較少的信譽。

提示:您可能需要反轉邊緣,多次運行熟悉的算法,並做一些額外的工作

所以,我試圖運行從s Dijkstra的所有其他節點,然后我試圖逆轉的邊緣,從s再次運行到所有其他節點。 但是,我發現我們必須將Dijskstra從s運行到所有其他節點 ,然后反轉邊,然后再將Dijkstra從所有其他節點運行t 我不確定這如何幫助我們找到要設置為零的邊。 根據我的直覺,我認為我們可以將最大重量邊設置為零。 反轉邊緣的意義何在?

我們需要運行Dijkstra的算法兩次-一次是使用s作為源頂點的原始圖,一次是使用反向圖並且t作為源頂點的圖。 我們將表示從第一次運行得到的頂點si之間的距離為D(i) ,從第二次運行得到的頂點ti之間的距離為D_rev(i)

請注意,我們可以向后跟隨反向邊(即,沿原始方向跟隨它們),因此D_rev(i)實際上是頂點it的最短距離。 同樣, D(i)是遵循Dijkstra算法的從頂點si的最短距離。

現在我們可以遍歷所有邊緣,對於連接v1v2每個邊緣e ,將D(v1)D_rev(v2) ,這對應於路徑s -> v1 -> v2 -> t的權重s -> v1 -> v2 -> t D_rev(v2) s -> v1 -> v2 -> te為零邊,因為我們可以從sv1且距離為D(v1) ,所以將e設置為0,從v1v2 ,然后從v2t的距離為D_rev(v2) 這些最小的答案。

粗略的證明草圖(以及重述):如果將邊e設置為0,但不在路徑中使用它,則最好將路徑中的邊設置為0。因此,我們只需要考慮包括歸零邊緣的路徑。 通過零邊e的最短路徑是首先采用從sv1的最短路徑,然后采用從v2t的最短路徑,這正是使用Dijkstra算法(即DD_rev計算D_rev

希望這個答案有幫助!

暫無
暫無

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

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