HDU - 3538 A sample Hamilton path(最短哈密顿路径+状压dp)

题目链接:点击查看

题目大意:求从0开始的最短哈密顿路径,并且要求了某些点的先后顺序

题目分析:哈密顿路径:由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次(百度百科)

既然按照一定的次序求最短路,可以模仿floyd求最短路的思想,然后套用状态压缩的模板来做,在状态压缩的过程中,1表示该点已经走过,0表示该点还未走过,dp[i][j]代表状态i到终点j的最短距离,那么初始化就是dp[1][0]=0,其余都为inf


 2019.11.28更新:

看了大蓝书后学了一种新的方法实现哈密顿路径,比之前这个代码更好理解更好实现了,特地来更新一下

 

直接上代码吧,注释比较清晰,有一点需要注意,可能是数据比较水的原因,用memset会MLE,但用for循环稳过

#include
#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;

const int inf=0x3f3f3f3f;

const int N=(1<<21)+100;

int dp[N][25];//dp[i][j]代表状态i到终点j的最短距离,状态:1表示已经走过该点,0表示未走过 

int f[25];

int d[25][25];

int main()
{
//	freopen("input.txt","r",stdin);
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=0;i<(1<

更新:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
  
typedef long long LL;
  
const int inf=0x3f3f3f3f;
  
const int N=22;

int maze[N][N],f[N];

int d[1<>j&1)
				{
					for(int k=0;k

 

你可能感兴趣的:(状压dp)