Pagini recente » Cod sursa (job #1463349) | Cod sursa (job #2753769) | Cod sursa (job #202122) | Cod sursa (job #2488010) | Cod sursa (job #1245485)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("cast.in");
ofstream fout("cast.out");
const int MAX_N = 13;
const int INF = (1 << 30);
int d[MAX_N][(1 << MAX_N)];
int t[MAX_N][MAX_N];
int n;
int get(int r, int s) {
if(d[r][s] != INF) {
return d[r][s];
}
vector<int> poz;
for(int b = 0; b < n; b++) {
if(s & (1 << b) && b != r) {
poz.push_back(b);
}
}
int sz = poz.size();
for(int i = 1; i < (1 << sz); i++) {
for(int r2 = 0; r2 < sz; r2++) {
if(i & (1 << r2)) {
int sn = 0;
for(int b = 0; b < n; b++) {
if(i & (1 << b)) {
sn = sn | (1 << poz[b]);
}
}
d[r][s] = min(d[r][s], t[r][poz[r2]] + max(get(r, s ^ sn), get(poz[r2], sn)));
}
}
}
return d[r][s];
}
int solve() {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
fin >> t[i][j];
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < (1 << n); j++) {
d[i][j] = INF;
}
}
for(int i = 0; i < n; i++) {
d[i][1 << i] = 0;
}
return get(0, (1 << n) - 1);
}
int main() {
int t;
for(fin >> t; t; t--) {
fin >> n;
fout << solve() << '\n';
}
return 0;
}