小学期学的算法和做OJ题的各种经验总结
-
差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有:
- dv ≤ du + wu->v
- 其中du和dv是从源点分别到点u和点v的最短路径的权值,wu->v是边u -> v的权值。
- 这个不等式可以化成 dv - du ≤ wu->v
-
比如给出三个不等式
{
b
−
a
≤
k
1
c
−
b
≤
k
2
c
−
a
≤
k
3
\left\{ \begin{array}{c} b-a ≤ k_1\\ c-b ≤ k_2\\ c-a ≤ k_3 \end{array} \right.
⎩⎨⎧b−a≤k1c−b≤k2c−a≤k3
求出c-a的最大值
由题得出
{
c
−
a
≤
k
1
+
k
2
c
−
a
≤
k
3
→
c
−
a
≤
m
i
n
(
k
1
+
k
2
,
k
3
)
\left\{ \begin{array}{l} c-a ≤ k_1+k_2\\ c-a ≤ k_3 \end{array} \to c-a≤min(k_1+k_2,k_3) \right.
{c−a≤k1+k2c−a≤k3→c−a≤min(k1+k2,k3)
因此比较 k1+k2 和 k3 的大小,求出最小的就是c-a的最大值了。
我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权,如图
根据c-a ≤ min(k1+k2, k3),我们可以看到求 a到c的最大值min(k1+k2, k3) 就是求从a到c的最短路径。
(也就是说,每条边的权重是两点的最大距离,从a到c沿着某条路径后把所有权值和k求出就是c - a ≤ k的一个,a到c的最短路径的距离就是满足所有不等式的条件下a到c的最大距离)
※注意点:
-
如果要求最大值想办法把每个不等式变为标准v-u<=k的形式,然后建立一条从v到u权值为k的边,变得时候注意v-u<k => v-u<=k-1
相反,如果求a到c的最小距离,只要把不等式全部变成 dv - du ≥ wu->v再求两点的最短路径
如果要求最小值的话,变为v-u>=k的标准形式,然后建立一条从u到v的k边,求出最短路径即可
-
如果权值为正,用dj,spfa,bellman都可以,如果为负不能用dj,并且需要判断是否有负环,有的话就不存在