题意:从0点开始走到n-1点,每个点经过且只经过一次,任意两点之间都有权值,最终的权值为所走路线权值之和,求最小的最终权值。
思路:哈密顿回路的模板题,乍一看还以为最短路 ,用到了位运算和贪心,f [i][j](i是一个二进制数,表示这n个点的状态:1代表走过;0代表没走过)表示i状态下走到 j 的最小权值,那么我们要求的最终答案就是f[(1<<n)-1][n-1],每次更新时将当前的f[i][j]值与上一个状态加上到 j 的权值取min即可。
位运算小课堂:
(n>>k)&1 取出整数n在二进制表示下的第k位
n&((1<<k)-1) 取出整数n在二进制表示下的第0位-第k-1位
(n>>k)XOR1 将n在二进制表示下的第k位取反
n|(1<<k) 将整数n在二进制表示下的第k位赋值为1
n&(~(1<<k)) 将整数n在二进制表示下的第k位赋值为0
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[1<<21][21];
int