dist[i][j] != dist[j][i] 状压DP+Floyd
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
typedef long long ll;
using namespace std;
#define _ std::ios_base::sync_with_stdio(0);cin.tie(0);
#define REP(i,n) for (int i = 0; i < int(n); ++ i)
#define REPI(i,a,n) for (int i = int(a); i < int(n); ++ i)
#define maxn 40010
#define INF 100000000
int dist[15][15];
int dp[1<<11][15];
int main() {
int n;
while (cin >> n) {
if (n == 0) break;
memset(dp, 0, sizeof(dp));
for (int i = 0; i <= n; ++ i) {
for (int j = 0; j <= n; ++ j) {
int t;
cin >> t;
dist[i][j] = t;
}
}
for (int k = 0; k <= n; ++ k) {
for (int i = 0; i <= n; ++ i) {
for (int j = 0; j <= n; ++ j) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
//for (int i = 0; i <= n ; ++ i){ for (int j = 0; j <= n; ++ j) cout << dist[i][j] << " "; cout << endl;}
for (int state = 0; state < (1<<n); ++ state) {
for (int i = 0; i < n; ++ i) {
if (state&(1 << i)) {
if (state == (1 << i)) {
dp[state][i+1] = dist[0][i+1];
}
else {
dp[state][i+1] = INF;
for (int j = 0; j < n; ++ j) {
if ((state&(1<<j)) && (i!=j)) {
dp[state][i+1] = min(dp[state][i+1], dp[state^(1<<i)][j+1] + dist[j+1][i+1]);
}
}
}
}
}
}
/* for (int i = 0; i < (1<<n); ++ i) {
for (int j = 1; j <= n; ++ j) {
cout << dp[i][j] << " ";
}
cout << endl;
}*/
int res = INF;
for (int i = 0; i < n; ++ i)
res = min(res, dp[(1<<n)-1][i+1]+dist[i+1][0]);
cout << res << endl;
}
}