【DP】最短路径(path)

该博客介绍了如何使用动态规划方法求解一种特殊的最短路径问题:在满足特定路径条件(A -> b1 -> B -> b2 -> A)的同时,确保所有点都被访问一次。博主提供了样例输入和输出,解析了思路,并给出了状态转移方程和C++代码实现。
摘要由CSDN通过智能技术生成

题目描述

给出一个平面,上面有若干的点,按照横坐标依次好序,现在给出A和B,b1,b2四点,要求在满足A -> b1 -> B -> b2 -> A的大路径的情况下,把所有点都经过一遍(A经过两遍)的最短距离

样例输入

5 1 3

1 3

3 4

4 1

7 5

8 3

样例输出

18.18

思路

可以发现,从B再走回A相当于说A再走一条没走过的路走到B
DP,设 f i , j f_{i,j} fi,j为第一条路径走到i,第二条路径走到j的最小距离
考虑转移,因为要把所有点都带上,所以设 k = m a x ( i , j ) + 1 k = max(i,j) + 1 k=max(i,j)+1来满足每个点都被走到过
考虑k的三种特殊情况


1.k = n+1 ,那么这就说明i,j会有一个已经到了n,分类讨论一下

  1. i= n,那么i到n之间的所有点都走过了,所以直接连边j,n,求最小值
  2. j = n,同上,连边i,n,求最小值

2.k = b1,因为按题目,第一路一定经过b1,所以此时不能转移 f i , k f_{i,k} fi,k
3.k = b2,同上,二路一定经过b2,所以不能转移 f k , j f_{k,j} fk,j

别的很统一就是两路分别转移k
状态转移方程如下:
f i , k = m i n ( f i , j + d i s i , k , f i , k ) ( k ≠ b 1 ) f_{i,k} = min(f_{i,j} + dis_{i,k}, f_{i,k})(k \neq b1) fi,k=min(f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值