最短Hamilton路径与旅行商问题
前言
发现很多篇博客都是要么直接贴代码,要么就对dp式子进行解释,没有说为什么得到这个式子就很让人感到无语,这可能就是为什么c站
最短Hamilton路径
题目转送门
题目意思是从0号点出发到n-1点的最短Hamilton路径 ,我们利用集合的角度来对其进行分析

那么这个转态的转移需要满足哪些条件呢
- 在当前的路径的状态中,i对应的位置需要为1,也就是当起的终点需要出现在路径上。
- 对于中间节点k而言,由每一个点只能出现一次,因此我们去掉i之后对应的路径的集合需要有节点k。
上面条件都满足的话就可以有转移式子:
d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , d p [ i − ( 1 < < j ) ] [ k ] + w [ k ] [ j ] dp[i][j] = min(dp[i][j],dp[i-(1<<j)][k] + w[k][j] dp[i][j]=min(dp[i][j],dp[i−(1<<j)][k]+w[k][j]
我们就以当外层循环都最后,也就是state转态表示所以的点都经过一次后,第二层循环为n-1也就是题目所问的终点的时候,我们在枚举k的时候也就是我们在考虑从哪一个点到终点比较好,如果我们选了一个点,那么这个点又会有同样的子问题。
代码:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
const int N

本文详细解释了最短Hamilton路径问题和旅行商问题的动态规划解决方案。通过集合的角度分析,给出了状态转移方程,并提供了相应的C++代码实现。在最短Hamilton路径问题中,从0号点出发找到到达n-1点的最短路径;旅行商问题则是起点任意,最终回到起点的最短路径。通过在Hamilton路径基础上增加一条从终点到起点的路径,即可解决旅行商问题。
最低0.47元/天 解锁文章
2万+





