#include using namespace std; const int inf = 2000000000; int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(false); int N; cin >> N; vector> D(N, vector(N)); for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { cin >> D[i][j]; } } for(int k = 0; k < N; k++) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { D[i][j] = min(D[i][j], D[i][k] + D[k][j]); } } } vector> dps(1 << N, vector(N, inf)); vector> dpt(1 << N, vector(N, inf)); dps[1][0] = 0; dpt[1][0] = 0; priority_queue, vector>, greater<>> pq; pq.push(make_tuple(0, 0, 1, 0)); while(!pq.empty()) { auto [t, s, bit, u] = pq.top(); pq.pop(); if(t > dpt[bit][u] && s > dps[bit][u]) { continue; } for(int v = 0; v < N; v++) { if(u >> v & 1) { continue; } int nbit = bit | (1 << v); int nt = t + D[u][v]; int ns = s + nt; if(dps[nbit][v] <= ns && dpt[nbit][v] <= nt) { continue; } dps[nbit][v] = min(dps[nbit][v], ns); dpt[nbit][v] = min(dpt[nbit][v], nt); pq.push(make_tuple(nt, ns, nbit, v)); } } int ans = inf; for(int i = 0; i < N; i++) { ans = min(ans, dps.back()[i]); } cout << ans << '\n'; return 0; }