#include <iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=12;
const int inf = 0x3f3f3f3f;
int f[(1<<maxn)][maxn];
int dis[maxn][maxn];
int n;
int main()
{
while(cin>>n && n)
{
int maxs=(1<<(n+1));
memset(dis,0x3f,sizeof dis);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) cin>>dis[i][j];
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
memset(f,0x3f,sizeof f);
for(int i=0;i<=n;i++)
f[(1<<i)][i]=dis[0][i];
//for(int i=0;i<=n;i++) f[(1<<i)][i]=dis[0][i]+dis[i][0];
for(int s=1;s<maxs;s++)
{
for(int j=0;j<=n;j++)
{
if(!(s&(1<<j))) continue;
int news=s^(1<<j);
for(int k=0;k<=n;k++)
{
if(news&(1<<k))
f[s][j]=min(f[s][j],f[news][k]+dis[k][j]);
}
}
}
cout<<f[maxs-1][0]<<endl;
}
return 0;
}
poj3311
最新推荐文章于 2022-08-16 22:05:53 发布