最大團問題-分支限界

問題描述:node

  給定無向圖G=(VE),其中V是非空集合,稱爲頂點集算法

  EV中元素構成的無序二元組的集合,稱爲邊集,無向圖中的邊均是頂點的無序對,無序對經常使用圓括號「( )」表示。spa

  若是UV,且對任意兩個頂點uvU有(uv)∈E,則稱UG徹底子圖指針

  G的徹底子圖UG的團當且僅當U不包含在G的更大的徹底子圖中。G最大團是指G中所含頂點數最多的團。code

  若是U∈V且對任意uvU有(uv)∈E,則稱UG空子圖G的空子圖UG的獨立集當且僅當U不包含在G的更大的空子圖中。G的最大獨立集是G中所含頂點數最多的獨立集。blog

  對於任一無向圖G=(VE),其補圖G'=(V', E')定義爲:V'=V,且(uv)∈E'當且僅當(uv)∈E隊列

  若是UG的徹底子圖,則它也是G'的空子圖,反之亦然。所以,G的團與G'的獨立集之間存在一一對應的關係。特殊地,UG的最大團當且僅當UG'的最大獨立集io


問題定義:
class

  解空間樹中結點類型:bbnode擴展

  活結點優先隊列中元素類型爲 CliqueNode(cn 表示與該節點相應的團的定點數,un表示結點爲根的子樹中的最大頂點樹的上界。level表示結點在子集空間樹中所處的層次;ch 左右兒子的結點標記)

  ch=1  左兒子  ch=0  右兒子

  ptr 指向解空間樹中相應結點的指針

  cn+n-level+1表示定點數上界的un值。

代碼描述:

相關結構體定義:

class bbnode{ friend class Clique; private: bbnode * parent; bool LChild; }; class CliqueNode{ friend class Clique; public: operator int () const {return un;} private: int cn, un, level; bbnode *ptr; }; class Clique{ friend void main(void); public: int BBMaxClique(int []); private: void AddLiveNode(MaxHeap<CliqueNode> &H,int cn,int un,int level,bbnode E[],bool ch); int * * a ,n; };

AddLiveNode:將當前構造的活結點 加入到子集空間樹中並插入活結點優先隊列中。

void Clique::AddLiveNode(MaxHeap<CliqueNode> &H,int cn,int un,int level,bbnode E[],bool ch) { bbnode * b = new bbnode; b->parent = E; b->LChild = ch; CliqueNode N; N.cn = cn; N.level = level; N.un = un; N.Insert(N); }

算法核心代碼:BBMaxClique

子集樹的根節點是 初始擴展結點 cn爲0      

i 表示當前擴展結點的解空間樹中所處的層次。

 

首先考察左兒子:

  頂點加入當前團,檢查該頂點與當前團中其餘頂點是否有邊相連。

  都有邊,可行,歸入 活結點 優先隊列中,AddLiveNode(),接着考察當前擴展結點的 右兒子結點,僅當un>bestn時,右子樹中可能含有最優解  ;

  不然,不可行。

int Clique::BBMaxClique(int bestx[]) { MaxHeap<CliqueNode> H(1000); bbnode * E = 0; int i=1, cn = 0, bestn = 0; while(i != n+1) { bool OK = true; bbnode * B = E; for(int j = i-1;j>0;B=B->parent,j--) { if(B->LChild && a[i][j]==0) { OK = false; break; } } if(OK) { if(cn + 1 > bestn) bestn = cn + 1; AddLiveNode(H,cn+1,cn+n-i+1,i+1,E,true); } if(cn+n-i >= bestn) AddLiveNode(H,cn+1,cn+n-i+1,i+1,E,true); CliqueNode N; H.DeleteMax(N); E = N.ptr; cn = N.cn; i = N.level; } for(int j=n;j>0;j--) { bestx[j] = E->LChild; E = E->parent; } return bestn; }
相關文章
相關標籤/搜索