#include<stdio.h>
#include<limits.h>
#define Min(x,y) ((x)>(y)?(y):(x))
#define XMAX 12
int Map[XMAX][XMAX];
int Dis[XMAX][XMAX];
int DP[XMAX][(1<<XMAX)];
int N;
void Floyd(void)
{
for(int k=0;k<N;k++)
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(Map[i][k]!=INT_MAX&&Map[k][j]!=INT_MAX)
Map[i][j]=Min(Map[i][j],Map[i][k]+Map[k][j]);
if(Map[j][k]!=INT_MAX&&Map[k][i]!=INT_MAX)
Map[j][i]=Min(Map[j][i],Map[j][k]+Map[k][i]);
}
}
}
int TSP(int S,int status)
{
if(DP[S][status]<INT_MAX)
return DP[S][status];
int t=1;
for(int i=0;i<N;i++,t<<=1)
{
if(status&t)
{
DP[S][status]=Min(DP[S][status]
,Map[S][i]+TSP(i,status&(~(1<<i))));
}
}
return DP[S][status];
}
int main(void)
{
while(scanf("%d",&N)&&N!=0)
{
N++;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
scanf("%d",&Map[i][j]);
Floyd();
for(int i=0;i<N;i++)
for(int j=0;j<(1<<N)-1;j++)
DP[i][j]=INT_MAX;
for(int i=0;i<N;i++)
DP[i][0]=Map[i][0];
TSP(0,(1<<N)-2);
printf("%d\n",DP[0][(1<<N)-2]);
}
return 0;
}
POJ3311(TSP)
最新推荐文章于 2021-04-20 19:35:30 发布