旅行者问题

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int G[20][20];
int dp[20][1<<20];
int laststate=1<<16;
int n;
void dfs(int now,int dis,int state) //现在在地方,从1到现在位置的距离,状态
{
    int i,j;
    if(now==n){
            if(state==laststate){
                dp[now][state]=min(dp[now][state],dis);
                return;
            }
    }

    if(dis>=dp[now][state]||dis>=dp[n][laststate]){  //减枝,比目前状态大的或许比最终的大的
        return ;
    }

    dp[now][state]=dis;
    for(j=2,i=2;i<=n-1;j=j<<1,i++){
        if(state&j){
            continue;
        }
        if(i==now){
            continue;
        }
        dfs(i,dis+G[now][i],state|j);
    }

    if(state==laststate^1){
        dfs(n,dis+G[now][n],state|j);
    }
    return ;
}
int main()
{

    int i,j;
        #ifndef ONLINE_JUDGE
    freopen ("in.txt", "r", stdin);
    #endif // ONLINE_JUDGE
    while(scanf("%d",&n)!=EOF){
        laststate=(1<<n)-1;
        for(i=0;i<20;i++){
            for(j=1;j<1<<20;j++){
                dp[i][j]=99999999999;
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                scanf("%d",&G[i][j]);
            }
        }
        dfs(1,0,1);
        printf("%d\n",dp[n][laststate]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xxf_is_girl_gad/article/details/90513696