Acwing-91-最短Hamilton路径(状压DP)
Posted ydddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing-91-最短Hamilton路径(状压DP)相关的知识,希望对你有一定的参考价值。
链接:
https://www.acwing.com/problem/content/93/
题意:
给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。
思路:
用二进制枚举哪些点被经过了.同时枚举经过的点j,再枚举经过点j之前的点k.
得到Dp[i][j] = min(Dp[i][j], Dp[lasti][k]+Len[k][j]).其中i对应经过点j时的压缩值,lasti为经过点j上一时刻的压缩值.
代码:
#include <bits/stdc++.h>
using namespace std;
int F[1<<20][30];
int Map[30][30];
int n;
int main()
scanf("%d", &n);
for (int i = 0;i < n;i++)
for (int j = 0;j < n;j++)
scanf("%d", &Map[i][j]);
memset(F, 0x3f3f, sizeof(F));
F[1][0] = 0;
for (int i = 1;i < (1<<n);i++)
for (int j = 0;j < n;j++)
if ((i >> j) & 1)
for (int k = 0;k < n;k++)
if ((i ^ (1<<j)) >> k & 1)
F[i][j] = min(F[i][j], F[i^(1<<j)][k]+Map[k][j]);
printf("%d\n", F[(1<<n)-1][n-1]);
return 0;
以上是关于Acwing-91-最短Hamilton路径(状压DP)的主要内容,如果未能解决你的问题,请参考以下文章
ybtoj 状压DP课堂过关AcWing 91最短 Hamilton 路径 &例题2最短路径