【笔记】差分约束
对于 n 个元素 \(a_n\),有若干不等式形如:\(a_i-a_j\leq x\)
注意到只需 \(a_i,a_j\) 符号不等,我们可以把所有不等式和等式转化成上述形式(等式即两个不等式,小于 x 即小等于 x-1 )
然后我们现在需要知道是否存在一种合法解满足上述所有不等式,又或者在存在合法解的情况下,求 \(a_n-a_1\) 的最小值,或者等价于,已知 \(a_1=0\) (其实只要确定了某一个 a 的值就可以),求 \(a_n\) 的最小值。
考虑对于 \(a_i-a_j\leq x\),即 \(a_i\leq a_j+x\),建一条从 \(j\) 到 \(i\) 边权 \(x\) 的有向边,然后从节点 1 跑一个单源最短路就行了
正确性即考虑那个 \(dist[i]\leq dist[j] + w_{j, i}\)
如果存在负环,则整个不等式组无解,可以用 SPFA 判负环
一些用途,比如一串格子选或不选,拿前缀和做差分约束,以 \(a_0\) 为起点,首先有 \(a_i-a_{i-1}\leq 1,a_{i-1}-a_i\leq 0\),然后就是题意比如 \(a_n-a_0=m\) 和其他限制之类的