//从这道题就可以看出状态DP的效率了(虽然是和弗洛伊德相比)
//主要是因为他N最多达到10,所以可以用!要是在高一点估计就要TLE了,还是安心的用状态DP吧
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,a[11],map[11][11],i;
for(i=0;i<=10;i++)
{
a[i]=i;
}
while(scanf("%d",&n)!=EOF,n)
{
int j,k;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
cin>>map[i][j];
}
}
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
for(k=0;k<=n;k++)
{
if(map[j][k]+map[k][i]<map[j][i])
map[j][i]=map[j][k]+map[k][i];
}
}
}
//for(i=1;i<=
int ans=9999999;
while(next_permutation(a,a+n+1))//对数组的全排列;
{
int cnt=0;
//for(i=0;i<=n;i++)
// cout<<a[i]<<" ";
//cout<<endl;
for(i=1;i<=n;i++)
{
//cout<<a[i]<<" ";
cnt+=map[a[i-1]][a[i]];
// cout<<map[a[i-1]][a[i]]<<" ";
}
cnt+=map[a[n]][a[0]];
// cout<<map[n][0]<<" ";
//cout<<endl;
ans=ans>cnt?cnt:ans;
}
cout<<ans<<endl;
}
}
1875MS//
如果是用状态DP的话可以达到0MS!!!!!!!!!;