Ø完全子图:给定无向图G=(V,E)。如果
UÍV,且对任意u,vÎU有(u,v)ÎE,则称
U是G的完全子图。
Ø
团
:G的完全子图U是G的团当且仅当U不包含
在G的更大的完全子图中。
Ø
G的最大团:是指G中所含顶点数最多的团。
Ø
空子图:如果UÍV且对任意u,vÎU有(u,v)
ÏE,则称U是G的空子图。
Ø
独立集:G的空子图U是G的独立集当且仅当
U不包含在G的更大的空子图中。
ØG的最大独立集:是G中所含顶点数最多的
独立集。
Ø补图:对于任一无向图G=(V,E)其补图G=
(V1,E1)定义为:V1=V,且(u,v)ÎE1当且
仅当(u,v)ÏE。
ØU是G的最大团当且仅当U是G的最大独立
集。
Ø解空间:子集树
Ø可行性约束函数:
顶点i到
已选入的顶点集中每一个顶点都有边相连。
Ø上界函数:
有足够多的可选择顶点使得算法有可能
在右子树中找到更大的团。
Ø复杂度分析:
最大团问题的回溯算法backtrack所需的
计算时间显然为O(n2n)。
void Clique::Backtrack(int i)// 计算最大团
{ if (i > n) {// 到达叶结点
for (int j = 1; j <= n; j++) bestx[j] = x[j];
bestn = cn; return;}
int OK = 1; // 检查顶点 i 与当前团的连接
for (int j = 1; j < i; j++)
if (x[j] && a[i][j] == 0) {
// i与j不相连
OK = 0; break;}
if (OK) {// 进入左子树
x[i] = 1; cn++;
Backtrack(i+1);
x[i] = 0; cn--;}
if (cn + n - i > bestn) {// 进入右子树
x[i] = 0;
Backtrack(i+1);}
}
Ø选择合适的搜索顺序,可以使得上
界函数更有效的发挥作用。例如在搜
索之前可以将顶点按度从小到大排
序。这在某种意义上相当于给回溯法
加入了启发性。
Ø
定义Si={vi,vi+1,...,vn},依次求出
Sn,Sn-1,...,S1的解。从而得到一个更
精
确的上界函数,若cn+Si<=max则剪
枝。同时注意到:从Si+1到Si,如
果找到一个更大的团,那么vi必然属
于找到的团,此时有Si=Si+1+1,否
则Si=Si+1。因此只要max的值被更新
过,就可以确定已经找到最大值,不
必再往下搜索了。