最短Hamilton路径与旅行商问题联系与解决

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

最短Hamilton路径与旅行商问题

前言

发现很多篇博客都是要么直接贴代码,要么就对dp式子进行解释,没有说为什么得到这个式子就很让人感到无语,这可能就是为什么c站

最短Hamilton路径

题目转送门
题目意思是从0号点出发到n-1点的最短Hamilton路径 ,我们利用集合的角度来对其进行分析
在这里插入图片描述

那么这个转态的转移需要满足哪些条件呢

  1. 在当前的路径的状态中,i对应的位置需要为1,也就是当起的终点需要出现在路径上。
  2. 对于中间节点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 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值