思路:一个类似TSP的问题,
只是每个点可以走多次,floyd预处理一下两两之间的距离。求最短距离。城市只有10个,所以可以考虑状态压缩,令dp[s][i]为到了i点时状态为s的最短距离,那么dp[s][i]=min(dp[s][i],dp[ss][j]+d[j][i])
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 1e9
int dp[1<<11][11];
int d[11][11];
int main()
{
int n;
while(scanf("%d",&n)!=EOF && n)
{
memset(dp,0,sizeof(dp));
for(int i = 0;i<=n;i++)
for(int j= 0;j<=n;j++)
scanf("%d",&d[i][j]);
for(int k = 0;k<=n;k++)
for(int i = 0;i<=n;i++)
for(int j = 0;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(int s=0;s<(1<<n);s++)
{
for(int i = 1;i<=n;i++)
{
if(s&(1<<(i-1)))
{
if(s==(1<<(i-1)))
dp[s][i]=d[0][i];
else
{
dp[s][i]=inf;
for(int j = 1;j<=n;j++)
{
if(s&(1<<(j-1)) && j!=i)
{
dp[s][i]=min(dp[s][i],dp[s^(1<<(i-1))][j]+d[j][i]);
}
}
}
}
}
}
int ans = dp[(1<<n)-1][1]+d[1][0];
for(int i = 2;i<=n;i++)
ans = min(ans,dp[(1<<n)-1][i]+d[i][0]);
printf("%d\n",ans);
}
}