-
cc:已经选择过的城市的连接起来的总长度 -
a[x[i-1]][x[j]]:要选择的第j个城市和他上一个被选择的城市之间的距离
void backtrack(int t)
{
// 处理倒数第二层
if(t==n)
{
// 约束函数(前者)+当前节点和源点是否右连接 + 限界函数(后者)
if(a[x[n-1]][x[n]]!=INF && a[x[n]][1]!=INF && (cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc || bestc==INF))
{
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
}
}
// 处理前n-3层
else
{
for(int j=i;j<=n;j++)
{
// 约束函数(前者)+限界函数(后者)
if(a[x[i-1]][x[j]]!=INF && (cc+a[x[i-1]][x[j]]<bestc || bestc==INF))
{
swap(x[i],x[j]);
cc+=a[x[i-1]][x[i]];
backtrack(i=1);
cc-=a[x[i-1]][x[i]];
swap(x[i],x[j]);
}
}
}
}