#include <vector>
#include <iostream>
using namespace std;
const int N = 20;
int bit(int x, int i) {
return (x >> i) & 1;
}
// f[v][used]
bool f[N][1 << N]; // 0
int p[N][1 << N]; // p[x][mask ^ (1 << x)] = v
int main() {
int n;
// ...
vector<vector<pair<int, int>>> g(n);
// ...
for (int start = 0; start < n; start++)
f[start][1 << start] = 1; // =0
// f[0][1 << 0] = 1;
for (int mask = 0; mask < (1 << n); mask++) // used
for (int v = 0; v < n; v++)
if (f[v][mask] == 1) // !=+INF
for (auto [x, w] : g[v]) {
// if (f[v][mask]+w < f[x][mask ^ (1 << x)])
f[x][mask ^ (1 << x)] = 1; // min= f[v][mask]+w
p[x][mask ^ (1 << x)] = v;
}
// 1000000000
// 0111111111
int mask = (1 << n) - 1;
for (int end = 0; end < n; end++)
if (f[end][mask] == 1) { // end ---> 0
// [end,mask]
while (mask > 0) {
path.push_back(end);
int v = p[end][mask];
mask ^= 1 << end;
end = v;
}
break;
}
}
|