[英]How do I prove the correctness of my greedy algorithm for vertex cover on a tree?
樹上的頂點覆蓋問題如下。
輸入:一個無環簡單無向圖G
輸出:一組頂點W,對於每個uv邊,u∈W或v∈W。我們希望最小化W的大小。
我的貪婪算法是初始化W =∅,然后,當G不為空時,重復以下步驟。 令L為G的葉頂點。令N(L)為與L中某個頂點相鄰的頂點集。更新W = W∪N(L)。 從G刪除頂點L∪N(L)及其入射邊。
到目前為止,我在所有情況下都可以使用該算法。 我如何證明它正確? 到目前為止,這就是我所擁有的。
假設還有另一個集合S是最優解。 矛盾的是,我想確定要么S不能覆蓋所有邊緣,要么S與我的貪婪算法產生的集合相同。
這是一個合理的開始,但是我看到兩個問題。 首先,最佳解決方案可能不是唯一的。 考慮具有四個最佳解的四頂點路徑abcd
: {a,c}, {b,c}, {b,d}
。 其次(您可能已經在這樣做了,但是您沒有這么說),有必要考慮將樹植根。 否則,例如在圖ab
上,我們有L = {a,b}
和N(L) = {b,a}
,並且產生的頂點覆蓋率是W = {b,a}
,這不是最佳的。 通過將a
指定為根,從定義上將其排除在葉子集中。
為了正式證明涉及循環的程序的正確性,通常最好使用歸納法來建立循環不變式。 請允許我提出兩個建議。
對於所有時間t(時間=循環迭代次數),令G(t)為時間t時G的剩余量,令W(t)為時間t時W的值。 對於G(t)的每個頂點覆蓋X,集合W(t)∪X是G(0)的頂點覆蓋,其中0是開始時間。
對於所有時間t,都存在一個包含W(t)作為子集的最優解。
設T為結束時間。 由於G(T)是空圖,所以X =∅是G(T)的有效頂點覆蓋,因此不變量1確定W(T)是G(0)的頂點覆蓋。 不變量2確定W(T)包含在某個最優解中。 由於W(T)本身是一個頂點覆蓋,因此W(T)本身必須是該最優解。
給定不變式2的歸納步驟是,給定一個包含W(t-1)但不包含W(t)的最優解,將其推算為另一個包含W(t)的最優解。 這涉及正式化您的直覺,即將葉子的鄰居帶到葉子上至少總是同樣有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.