[英]How do I prove this algorithm's correctness?
我的算法:
構造一個新圖 G',而對於 V 中的每個頂點 v,在 G' 中創建兩個頂點 v_0 和 v_1,對於 E 中的每個邊 (u, v),創建兩個邊 (u_0 , v_1) 和 (u_1,v_0)在 G'。 從 s_0 開始在 G' 上運行 Dijkstra。
G' 中以 v_0 結尾的所有路徑都具有偶數條邊,因此可以通過確定 G' 中從 s_0 到 t_0 的最短路徑來找到到 G 中頂點 t 的最短偶數長度路徑。
如何證明這個算法的正確性?
G' 中以
v_0
結尾的所有路徑都有偶數條邊
這並不完全正確。 v_0
有一些傳入邊緣,比如p_1 -> v_0
,並且該路徑具有奇數個邊緣 ( 1
)。
不過,你已經接近真相了。 如果我們采用原始圖G
並且對於每個頂點v
我們在G'
創建兩個頂點v_0
和v_1
,那么我們可以將G'
分成兩個(不相交的)頂點集 - 0
-頂點和1
-頂點。
我聲明:
G'
中從任何0
頂點開始並在任何0
頂點結束的所有路徑都有偶數條邊。
這是真的,因為G'
是二分的。 根據定義,二部圖是一個圖,其頂點可以分為兩個不相交的集合(在我們的例子中是0
頂點和1
頂點),因此每條邊都連接來自不同集合的兩個頂點。 我們構建G'
的方式使其成為二部的,因為我們從不連接屬於同一集合的頂點(我們總是將u_0
與v_1
連接,反之亦然)
在二部圖中,如G'
,從一組中的一個頂點開始並在同一組中的一個頂點結束的每條路徑都有偶數條邊。 剩下要做的唯一一件事就是找出最短的(使用您選擇的最短路徑算法)。
假設開始節點是S,結束節點是F
在修改后的圖上,如果我們通過連接兩個節點的邊從 u i到 v j ,那么j=(i+1) mod 2
順便定義邊。
因此,如果我們通過任意路徑從 u i到 v j , j=(i+n) mod 2
其中 n 是路徑的長度。 (結論一)
因此,如果我們通過某條路徑從 S 0到 F 0 ,則0 = (0 + n) mod 2
意味着 n 是偶數
所以這證明了從 S 0到 F 0 的任何路徑都遍歷偶數邊(結論 2)
此外,根據邊在新圖中的定義方式,我們可以說對於舊圖中的任何邊 (u,v),對於某些 i,j,邊 (u i ,v j ) 存在於新圖中(結論 3)
現在,如果在原始圖中,存在偶數長度路徑,設最短路徑為 SA 1 A 2 ...A 2m-1 F,其中 A i可以重復。 (偶數邊意味着奇數個節點)。 然后在新圖中,我們可以從 S 0開始,遍歷 S 0 A 1 i A 2 j ...A 2m-1 k F m到 F 上(來自結論 3)。 那么 F 上的下標將是(0 + 2m-1 +1) mod 2 = 0
(來自結論 2)。 因此,新圖上也將存在一條包含相同長度的路徑。
因此,如果解存在,則新圖中也存在從 S 0到 F 0的路徑(結論 4)
此外,根據邊在新圖中的定義方式,對於從 u i到 v j 的每條邊,原始圖中都有一條從 u 到 v 的邊。 因此,對於新圖中從 u i到 v j 的任何路徑,在舊圖中都有一條從 u 到 v 的對應路徑具有相同的長度
因此,如果存在從 S 0到 F 0 的路徑,則原始圖中存在對應的長度相同的路徑(結論 5)
結論 2,4 和 5 一起證明從 S 0到 F 0的最短路徑是正確答案。 如果找不到路徑,那么它也不存在於原始圖中(來自結論 4)
因此,算法是正確的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.