最短Hamilton路(二进制状态压缩)
二进制状态压缩
二进制数的最低位从0开始计数
操作 | 实现
—|—
取出第k位 | $(n>>k)&1$
取出第0-(k-1)位 | n& ( (1<<K)-1 )
n的二进制数第k位取反 | n^(1<<K)
n的二进制数第k位赋值为1 | n|(1<<k)
n的二进制数第k位赋值为0 | n&(~1<<K)
状态压缩dp例题
最短Hamilton路
给定n个顶点的带权无向图(n<=20),顶点从0-(n-1)编号,求最短的Hamilton路
Hamilton路定义:0-(n-1)每个点不重不漏恰好经历一次
思路
- 数i的二进制每一位代表点i是否走过,1代表走过,0代表还未走过
- 用
F[i,j]
代表点被经历的状态,i是二进制数,处于点j时的最短路径和 - 状态转移:
F[i,j]=min{F[i xor (1<<j) , k ] + weight[k,j] }
xor代表异或
到点j的距离=所有已经走过的点k路径和+ 点k到点j的权值 的最小值
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!