解法
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 12
typedef __int64 LL;
#define inf 0x3f3f3f3f
int D[maxn][maxn];
int dp[1<<maxn][maxn];
void floyd(int n)
{
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
if(!n) break;
++n;
for(i=1;i<=n;++i) D[i][i]=0;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j) scanf("%d",&D[i][j]);
floyd(n);
memset(dp,inf,sizeof(dp));
dp[1][1]=0;
for(i=1;i<(1<<n);++i)
for(j=1;j<=n;++j)
{
if(i&(1<<(j-1)))
{
for(int k=1;k<=n;++k)
if(j!=k&&(i&(1<<(k-1))))
dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+D[k][j]);
}
}
int ans=inf;
for(i=1;i<=n;++i) ans=min(ans,dp[(1<<n)-1][i]+D[i][1]);
printf("%d\n",ans);
}
return 0;
}