差分约束学习笔记

posted on 2023-08-28 07:16:04 | under 笔记 | source

前言

被 lgj 喷太弱后的 zsw 决定继续摆烂奋发图强。

简介

对于一些 \(n\) 元一次不等式组,考虑将每条不等式转换为图上若干条有向边,便可通过求解最短(最长)路来解方程组。而这样建图的思想我们称之为 差分约束

实现

  • 建图

    建图操作可以说是差分约束的精髓了。

    具体的,若有不等式 \(a-b\le c\),其中 \(c\) 是常数。移项后得 \(a\le b+c\),我们发现这与图论的三角不等式 \(dis_v\le dis_u+w\) 极为相似,那不妨建 \(e(b,a)=c\) 的有向边。

    建图后,跑一次最短路,此时 \(dis_i\) 就是原方程一组解。

    那么对于 \(a-b\ge c\) 该怎么办?同上,建边 \(e(b,a)=c\) 的有向边,跑最长路即可。

    不过在实际问题中,往往会同时出现上述两种不等式,此时操作需要统一,也就是要让不等号统一。运用不等式的性质,两边同乘 \(-1\) 后会变号,即:\(a-b\le c\to b-a\ge-c\)\(a-b\ge c\to b-a\le -c\)

    还需注意的是,\(a\le b+c\) 对应的是最短路,无解的情况就是有负环;\(a\ge b+c\) 对应的是最长路,无解则是有正环。注意分辨。

    那么求最短路和最长路有何区别?直观来看最短路对应着最小解集,因为 \(dis_u\) 小则 \(dis_v\) 小,全局上也是最小。相应的,最长路也对应着最大解集。

    实际情况与上面恰恰相反。为什么?显然 \(dis_v\) 可能被多个 \(dis_{u_i}+w_i\) 转移,为方便讨论我们令 \(p_i=dis_{u_i}+w_i\)。对于最短路而言,最终一定有 \(dis_v=\min p_i\),而回到不等式中就是 \(a= \min {b_i+c_i}\),显然 \(a\) 再大一点就无法满足这条最小式子。因此此时的 \(a\) 恰好是合法区间的上界,也就对应着最大解集。最长路的情况同上。

    总结:先判断题目是求最小还是最大解集。如果是最大,则先统一形式为 \(a\le b+c\),然后建图跑最短路;反之先统一形式为 \(a\ge b+c\),然后建图跑最长路。

  • 模板

    先声明:差分约束更多的是一种建图思想,最短(最长)路算法的选择是多样的。

posted @ 2026-01-14 17:57  Zwi  阅读(0)  评论(0)    收藏  举报