#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
今日推荐
周排行