题意限制实质上是 N−1 个不等式,可以用差分约束算法求解,最短路的 dis[x] 相当于 x 的坐标。
接下来我们根据题意对坐标的约束,建差分约束图。
首先是跳跃 D 的限制:
先按房子的高度 h 从小到大排,对于高度排序相邻的两个房子 x 和 y(h[x]<h[y]):
- 如果 x<y ,则限制为 dis[y]−dis[x]≤D ,点 x 向点 y 连边权为 D 的有向边
- 如果 x>y ,则限制为 dis[x]−dis[y]≤D ,点 y 向点 x 连边权为 D 的有向边
其次是每个位置不能有两栋房子的限制:
对于 x 和 x+1 ,限制为 dis[x+1]−dis[x]≥1 ,转成最短路(小于等于式)就是 dis[x]−dis[x+1]≤−1,点 x+1 向点 x 连边权为 −1 的有向边。
由于题目只要求两点之间的最大差值,设高度最小的点是 st ,高度最大的点是 ed (h[st]<h[ed])。
- 如果 st<ed ,则限制为 dis[ed]−dis[st]≤ans ,ans 即为所求答案,也就是以 st 为源点跑最短路,得到的 dis[ed] 即为所求。
- 如果 st>ed ,则限制为 dis[st]−dis[ed]≤ans ,ans 即为所求答案,也就是以 ed 为源点跑最短路,得到的 dis[st] 即为所求。
对建好的差分约束图,用 SPFA 跑单源最短路即可,有负环的话就是无解。
SPFA 时间复杂度:最坏 O(VE),其中 V 是顶点数,E 是边数。