演算法設計與分析 最大團問題(回溯法)

2022-01-11 11:02:47 字數 3299 閱讀 7952

了解最大團問題(maximum clique problem, mcp)之前需要明白幾個概念。複習一下圖論知識......

完全圖:如果無向圖中的任何一對頂點之間都有一條邊,這種無向圖稱為完全圖。

完全子圖:給定無向圖g=(v,e)。如果u

v,且對任意u,v

u 有(u,v)

e,則稱u 是g 的完全子圖。

團(最大完全子圖): u是g的團當且僅當u不包含在g 的更大的完全子圖中

最大團:g 的最大團是指g中所含頂點數最多的團。

空子圖:給定無向圖g=(v,e)。如果u

v,且對任意u,v

u 有(u,v) ∉ e,則稱u 是g 的空子圖。g的空子圖u是g的獨立集當且僅當u不包含在g的更大空子圖中。

獨立集:對於給定無向圖g=(v,e)。如果頂點集合v*

v,若v*中任何兩個頂點均不相鄰,則稱v*為g的點獨立集,或簡稱獨立集。

最大獨立集:g中所含頂點數最多的獨立集。

例如:

圖a是乙個無向圖,圖b、c、d都是圖a的團,且都是最大團。

補圖:

圖g的補圖,通俗的來講就是完全圖kn去除g的邊集後得到的圖kn-g。在圖論裡面,乙個圖g的補圖(complement)或者反面(inverse)是乙個圖有著跟g相同的點,而且這些點之間有邊相連當且僅當在g裡面他們沒有邊相連。

大致思路:

首先設最大團為乙個空團,往其中加入乙個頂點,然後依次考慮每個頂點,檢視該頂點加入團之後仍然構成乙個團,如果可以,考慮將該頂點加入團或者捨棄兩種情況,如果不行,直接捨棄,然後遞迴判斷下一頂點。對於無連線或者直接捨棄兩種情況,在遞迴前,可採用剪枝策略來避免無效搜尋。

為了判斷當前頂點加入團之後是否仍是乙個團,只需要考慮該頂點和團中頂點是否都有連線。

如圖1所示,給定無向圖g=,其中v =,e=。根據mcp定義,子集是圖g的乙個大小為2的完全子圖,但不是乙個團,因為它包含於g的更大的完全子圖之中。是g的乙個最大團。和也是g的最大團。

圖2是無向圖g的補圖g'。根據最大獨立集定義,是g的乙個空子圖,同時也是g的乙個最大獨立集。雖然也是g'的空子圖,但它不是g'的獨立集,因為它包含在g'的空子圖中。是g'的最大獨立集。和也是g'的最大獨立集。

以圖1為例,利用回溯法搜尋其空間樹,具體搜尋過程(見圖3所示)如下:假設我們按照1®2®3®4®5的順序深度搜尋。

開始時,根結點r是唯一活結點,也是當前擴充套件結點,位於第1層,此時當前團的頂點數cn=0,最大團的頂點數bestn=0。

在這個擴充套件結點處,我們假定r和第二層的頂點1之間有邊相連,則沿縱深方向移至頂點1處。此時結點r和頂點1都是活結點,頂點1成為當前的擴充套件結點。此時當前團的頂點數cn=1,最大團的頂點數bestn=0。繼續深度搜尋至第3層頂點2處,此時頂點1和2有邊相連,都是活結點,頂點2成為當前擴充套件結點。

此時當前團的頂點數cn=2,最大團的頂點數bestn=0。再深度搜尋至第4層頂點3處,由於頂點3和2有邊相連但與頂點1無邊相連,則利用剪枝函式剪去該枝,此時由於cn+n-i=2+5-4=3>bestn=0,則回溯到結點2處進入右子樹,開始搜尋。此時當前團的頂點數cn=2,最大團的頂點數bestn=0。再深度搜尋至第5層頂點4處,由於頂點3和4無邊相連,剪去該枝,回溯到結點3處進入右子樹,此時當前團的頂點數cn=2,最大團的頂點數bestn=0。

繼續深度搜尋至第6層頂點5處,由於頂點5和4有邊相連,且與頂點1和2都有邊相連,則進入左子樹搜尋。由於結點5是乙個葉結點,故我們得到乙個可行解,此時當前團的頂點數cn=3,最大團的頂點數bestn=3。vi

的取值由頂點1至頂點5所唯一確定,即v=(1, 2, 5)。此時頂點5已不能再縱深擴充套件,成為死結點,我們返回到結點4處。由於此時cn+n-i=3+5-6=2

圖的鄰接矩陣

bool x[maxnum]; //

當前解int cn;//

當前團的頂點數

int bestn;//

當前的最優解

int n;//

圖g的頂點數

int e;//

圖g的邊數

void backtrack(int

i) }

printf("\n

");return

; }

bool ok=true

;

for(j=1; j)

}if(ok)//

進入左子樹

if(cn+n-i>bestn) //剪枝}

intmain()

cn=bestn=0

; backtrack(1);

return0;

}/*5 71 2

1 41 5

2 52 3

3 54 5

*/

演算法分析 回溯法 最大團問題

在若干點和若干連線中,找到完全子圖,即子圖中各個點都和其他點相連 有4部分 1.定義全域性變數 2.約束函式 限制生成左子樹的函式 3.遞迴函式 4.呼叫遞迴函式的函式,也可以直接寫在main 1.定義全域性變數 const int m1 5 元素數 vector vector a1 int cn1...

最大團問題 回溯法

題目 對於給定的無向圖,找出他的最大團 分析 圖的乙個完全子圖就是乙個團,所以找最大團,通俗點講就是在乙個無向圖中找出乙個點數最多的完全圖 任意兩點之間均有邊相鄰 採用回溯法,對於解空間的子集樹,只有當前節點和所有已選的頂點都相連,才進入左子樹 而當 當前結點加上剩下節點數比最優節點的個數多時 才進...

回溯法 最大團問題c

本文參考 1 問題描述 給定無向圖g v,e v是頂點集,e是邊集。如果u v,且對任意u,v u有 u,v e,u,v是兩個頂點的符號,則稱u是g的完全子圖。g的完全子圖u是g的乙個團當且僅當u不包含在g的更大的完全子圖中。注 最大團定義 從無向圖的頂點集中選出k個並且k個頂點之間任意兩點之間都相...