解空间:子集树
可行性约束函数:顶点t到已经选入顶点集中每一个顶点之间都有边
限界函数:有足够多的可选择的顶点使得算法有可能在右子树中找到更大的团(即cn+(n-t)>bestn)
复杂度分析:O(n*2^n)
需要掌握的习题
代码
#include <iostream>
using namespace std;
int n; //图的顶点个数
int cn; //当前顶点数
int x[100]; //当前解
int bestx[100]; //当前最优解
int bestn; //当前最大顶点数
int a[100][100]; //图的邻接矩阵
void Backtrack(int t)
{
if(t>n)
{
for (int i = 1; i <= n;i++)
bestx[i] = x[i];
bestn = cn;
return;
}
else
{
int OK = 1;
for (int i = 1; i < t;i++)
{
if(x[i]==1&&a[i][t]==0) //判断当前顶点与已经加入解路径的顶点之间是否有边
{
OK = 0;
break;
}
}
if(OK) //OK为1表示当前顶点能接入,进入左子树
{
x[t] = 1;
cn += 1;
Backtrack(t + 1);
x[t] = 0;
cn -= 1;
}
if(cn+n-t>bestn) //当前解中顶点的个数与剩下顶点的个数之和大于最优值才有可能产生新的最优值,才能进入右子树
{
x[t] = 0;
Backtrack(t + 1);
}
}
}
int main()
{
for (int i = 0;i<=n;i++)
x[i] = 0;
cout << "请输入顶点个数" << endl;
cin >> n;
cout << "请输入邻接矩阵" << endl;
for (int i = 1; i <= n;i++)
for (int j = 1; j <= n;j++)
cin >> a[i][j];
Backtrack(1);
cout << "最优值为:"<<bestn << endl;
cout << "最优解为:";
for (int i = 1; i <= n;i++)
{
if(bestx[i]==1)
cout << i << " ";
}
cout << endl;
return 0;
}