- cn:已经已经选好的顶点数
- x:路径数组
- a:两个顶点是否相连的信息
void backtrack(int i)
{
if(i>n)
{
记录最优解;
bestn = cn; // 更新最优值
return;
}
flag = true;
// 左分支约束函数(判断当前顶点是否和已选入的顶点都有边相连)
for(int j=1;j<i;j++)
{
if(x[j] ==1 && !a[i][j]) // 前者是寻找已经选择过的结点 ; 后者是判断他们是否相连
{
ok=false;
break;
}
}
// 如果ok=true,说明通过了约束判断,开始进入左分支
if(ok)
{
x[i]=1;
cn++;
backtrack(i+1);
cn--;
}
// 分析限界函数,进入右分支 “cn”代表已经选好的顶点数 ; "n-i"就代表剩余的顶点数
if(cn+n-i > bestn)
{
x[i]=0;
backtrack(i+1);
}
}