浅说——查分约束

首先提一句,这系统是基于最短路的基础上的。(尤其是SPFA

没学过最短路的看一下

单源最短路径问题

单源最短路径=Single Source Shortest Path

即在有向图(或无向图)中求解给定点到其他点之间的最短距离

我们已知的方法是…… Dijkstra算法

蛋蛋蛋但是Dijkstra算法的有局限性!!!

如果边权为负值,Dijkstra算法还正确吗?

求解下图A至其他点的最短距离(单源最短路径)

算法步骤:

扫描二维码关注公众号,回复: 6966935 查看本文章
  1. 标记点A
  2. Dist[C]=2最小,标记点C
  3. Dist[B]=3最小,标记点B

结束 但是ShortestDist[C]=1

错误结果的原因

Dijkstra的缺陷就在于它不能处理负权回路:

Dijkstra对于标记过的点就不再进行更新了,所以即使有负权导致最短距离的改变也不会重新计算已经计算过的结果

我们需要新的算法——Bellman-Ford

关于Bellman-Ford我就不细讲了,详情看 最短路

Bellman-Ford 进一步的优化——SPFA算法

时间复杂度一般认为是O(kE) 其中k是一个较大的常数,

不好估计,但是可以看出SPFA算法效率应当是很高的

经验表明Dijkstra算法的堆优化要比SPFA快(能用Dijkstra还是别用SPFA,有些题卡常,卡SPFA)

但SPFA比普通的Dijkstra算法快。

而SPFA算法可以处理负权的问题,而且比Dijkstra算法的堆优化的代码要容易实现,因此SPFA是一个很好的算法。

差分约束系统(终于步入正题了)

啥是差分约束?

摘自百科

例如:求x3-x0的最大值

x1-x0<=2      (1)

x2-x0<=7      (2)

x3-x0<=8      (3)

x2-x1<=3      (4)

x3-x2<=2      (5)

当然通过手动推导可以求出答案x3-x0<=7

通过叠加不等式可以推导出x3-x0<=7,最大值即为7,我们可以通过建立一个图,包含4个顶点,对每个xj-xi<=bk,建立一条i到j的有向边,权值为bk

通过求出这个图的x0到x3的最短路可以知道也为7,这是巧合吗?

并不是 之所以差分约束系统可以通过图论的最短路来解,是因为xj-xi<=bk,

会发现它类似最短路中的三角不等式d[v] <=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]

而求取最大值的过程类似于最短路算法中的松弛过程

猜你喜欢

转载自www.cnblogs.com/mzyczly/p/11312146.html
今日推荐