頂點覆蓋問題的近似算法


問題描述:無向圖G=(V,E)的頂點覆蓋是它的頂點集V的一個子集V’包含於V,使得若(u,v)是G的一條邊,則v∈V’或u∈V’。頂點覆蓋V’的大小是它所包含的頂點個數|V’|。

下面的近似算法以無向圖G為輸入,並計算出G的近似最優頂點覆蓋,可以保證計算出的近似最優頂點覆蓋大小不會超過最小頂點覆蓋大小的2倍。

VertexSet approxVertexCover ( Graph g )

{ cset=空集;

e1=g.e;

while (e1 != 空集) {

從e1中任取一條邊(u,v);

cset=cset∪{u,v};

從e1中刪去與u和v相關聯的所有邊;

}

return c

}
View Code

Cset用來存儲頂點覆蓋中的各頂點。初始為空,不斷從邊集e1中選取一邊(u,v),將邊的端點加入cset中,並將e1中已被u和v覆蓋的邊刪去,直至cset已覆蓋所有邊。即e1為空。

圖(a)~(e)說明了算法的運行過程及結果。(e)表示算法產生的近似最優頂點覆蓋cset,它由頂點b,c,d,e,f,g所組成。(f)是圖G的一個最小頂點覆蓋,它只含有3個頂點:b,d和e。

下面考察近似算法的性能。若用A記為算法循環中選取出的邊的集合,則A中任何兩條邊沒有公共頂點。算法終止時有|cset|=2|A|.

另一方面,圖G的任一頂點覆蓋,一定包含A中各邊的至少一個端頂點,G的最小頂點覆蓋也不例外。因此,若最小頂點覆蓋為cset*,則|cset*|>=A.由此可得,|cset|<=2|cset*|.即算法的性能比為2.

以下參考北大屈老師課件:

 

 對於上圖,我們來運行下近似算法。比如我們任意選擇一條邊,比如說1和2關聯的邊。

 選了之后,覆蓋集含有1和2兩個頂點,然后刪除與1和2頂點關聯的邊

 再次選擇3,4頂點,然后3,4頂點進入覆蓋集。

 刪除與3,4頂點關聯的邊。

 重復上述步驟,此時選擇5,6頂點。

 

 近似算法輸出1,2,3,4,5,6.但最優解是1,3,6,9.故近似算法有誤差。

 

 

 

 參考:王曉東《算法設計與分析》第二版

           北大《算法設計與分析第二版》

           https://baike.so.com/doc/5688800-5901497.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM