枚举经过的点,,,
dp[i][j]表示到j点状态为i时的最小花费
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 100000000
int n;
int dis[12][12];
int dp[1<<12+5][12];
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
scanf("%d",&dis[i][j]);
}
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
int sta= 1<<(n+1);
for(int i=0;i<sta;i++)
for(int j=0;j<=n;j++)
dp[i][j]=Max;
for(int i=0;i<=n;i++)
dp[1<<i][i]=dis[0][i];
for(int i=0;i<sta;i++)
{
for(int j=0;j<=n;j++)
{
if(i&(1<<j))
{
for(int k=0;k<=n;k++)
{
if(i&(1<<k))
{
dp[i][j]=min(dp[i][j],dp[i&(~(1<<j))][k]+dis[k][j]);
}
}
}
}
}
printf("%d\n",dp[sta-1][0]);
}
}