#include #include #include #include #include #include #include using namespace std; int n, src; vector< vector > matrix; vector< vector > supportGraph; int maxPath(int source, int dest) { /**/ if(supportGraph[ source ][ dest ] != -1) return supportGraph[ source ][ dest ]; supportGraph[source][dest] = std::numeric_limits::max(); int index = 1 << dest; for(int i = 0; i < n; ++i) { if( i != dest && ( source & ( 1 << i ) ) ) { supportGraph[source][dest] = min( supportGraph[source][dest], matrix[i][dest] + maxPath(source - index, i) ); } } return supportGraph[source][dest]; } int main(int argc, char **argv) { std::ifstream input("input.txt"); std::ofstream output("output.txt"); assert(input); assert(output); input >> n; matrix.resize(n); for(int i = 0; i < n; ++i) { matrix[i].resize(n); } supportGraph = vector< vector >( 1<(n,-1) ); for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { input >> matrix[ i ][ j ]; } } for(int i = 0; i < n; ++i) { supportGraph[ 1 << i ][ i ] = matrix[ src ][ i ]; } output << maxPath( ( 1 << n ) - 1, 1); input.close(); output.close(); return 0; }