AcWing 91. 最短Hamilton路径
原题链接
中等
作者:
KaFno
,
2024-11-13 16:52:36
,
所有人可见
,
阅读 1
#include <iostream>
#include <vector>
#include <array>
#include <limits>
#include <algorithm>
using namespace std;
array<array<int, 20>, 20> a;
int main()
{
int n; cin >> n >> a[0][0];
vector<vector<int>> f(1 << n, vector<int>(n, numeric_limits<int>::max()));
//f[i][j]: 在状态i(如11001)下, 从0走到j的最小距离的集合
for (int j = 1; j < n; ++j) cin >> f[(1 << j) + 1][j];
//只有0和j时(如i=10001, j=4时), 初始化从0到j的距离(即a[0][1~n-1]的值), 这样就不用f[1][0]=0了
//f[1][0] = 0 意为设起点为0, 从0到0距离为0, 但较难理解
for (int i = 1; i < n; ++i)
for (int j = 0; j < n; ++j) cin >> a[i][j];
for (int i = 2; i < 1 << n; ++i)
for (int j = 1; j < n; ++j)
for (int k = 1; i >> j & 1 && k < n; ++k)
if (i >> k & 1) f[i][j] = min(f[i][j], f[i - (1 << j)][k] + a[k][j]);
//f[i-(1<<j)][k]:i不经过j的状态, 从0走到k的最小距离的集合
cout << f[(1 << n) - 1][n - 1];
return 0;
}