链接
题目描述
给定一张n个点的带权无向图,点从0~n-1标号,求起点0到终点n-1的最短 Hamilton 路径。Hamilton 路径的定义是从 到 不重不漏地经过每个点恰好一次。
样例输入
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
样例输出
18
思路
还是状压DP
还是想到设
f
i
,
j
f_{i,j}
fi,j为到第i个点,到的点的状态为j,那么转移就枚举i到的点k,然后转移就好了
要判断当前状态是否符合转移的条件
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, a[25][25], f[20][1048580];
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &a[i][j]);
memset(f, 0x7f, sizeof(f));
f[0][1] = 0;
for(int i = 0; i < (1 << n); ++i)
for(int j = 0; j < n; ++j) {
if(!((i >> j) & 1)) continue;
for(int k = 0; k < n; ++k)
if(j != k) {
if(!((i >> k) & 1)) continue;
f[k][i] = min(f[k][i], f[j][i ^ (1 << k)] + a[j][k]);
}
}
printf("%d", f[n - 1][(1 << n) - 1]);
return 0;
}