#include <cmath> #include <iostream> #include <vector> #include <set> #include <unordered_map> #include <climits> using namespace std;
vector<vector<int>> to; vector<unordered_map<int, unordered_map<int, int>>> dp; int main() { int n; cin>>n; to = vector<vector<int>>(n, vector<int>(n)); for(int i = 0; i<n; ++i) { for(int j = 0;j<n; ++j) { cin>>to[i][j]; } } dp = vector<unordered_map<int, unordered_map<int, int>>>(n+1); for(int i = 1; i<n; ++i) { dp[1][1<<i][i] = to[0][i];
} for(int len = 2; len<n; ++len) { for(auto p : dp[len-1]) { for(auto q : p.second) { for(int s = 1; s<n; ++s) { if((1<<s)&p.first)continue; if(dp[len].count(p.first|1<<s)) { if(dp[len][p.first|1<<s].count(s)) { dp[len][p.first|1<<s][s] = min(dp[len][p.first|1<<s][s], q.second+to[q.first][s]); } else { dp[len][p.first|1<<s][s] = q.second+to[q.first][s]; } } else { dp[len][p.first|1<<s][s] = q.second+to[q.first][s]; } } } }
} int minDist = INT_MAX; for(auto p : dp[n-1]) { for(auto q:p.second) { minDist = min(minDist, q.second+to[q.first][0]); } } cout<<minDist<<endl; }
|