回溯法——旅行售货员问题

94 阅读1分钟
  • 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]);
            }
        }
    }
}