题目描述
给出一个平面,上面有若干的点,按照横坐标依次好序,现在给出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,分类讨论一下
- i= n,那么i到n之间的所有点都走过了,所以直接连边j,n,求最小值
- 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