关于差分约束的一切

观前须知

笔者的博客主页

声明

本文使用 CC BY-NC-SA 4.0 许可

本文为笔者在 OI 学习中的复习向学习笔记。
部分内容会比较简略。
如有好的习题会不断补充。

知识简介

差分约束解决这样一类问题:
给定一个 n 元一次不等式组,让你求出一组解/判定是否有解/算出某个数的最值/算出和的最值……
先从最简单的开始:

P5960 【模板】差分约束

那么怎么做呢?
发现对于形如 xixjc 的一个不等式可变形为 xixj+c
对于一个这样的不等式组:

{x1x2+c1x2x3+c2x1x3+c3

可以推出 x1x3+min(c1+c2,c3)
联想一下,这个式子有什么意义呢?

来看这张图:
三角不等式

不难发现,有 x1x3+Dis(x1,x3)
那么我们可以把三个变量转换为三个点,对于每个约束两个变量关系的不等式,变为图上的一条边!
考虑最短路中的这个式子: disvdisu+w
那么一个形如 xixjcxixj+c 的式子,
就可以变成图上一条从 j 指向 i,权值为 c 的边!
同理,一个形如 xixjc 的式子, 可以变为一条从 i 指向 j,权值为 c 的边。
那么图就可以建出来了。
(如果涉及到 xixj<c 的式子,可以考虑变为 xixj<=c1 处理)

值得一提的一个性质
一个这样的不等式组要不然无解,要不然有无数多组解
因为只要有一组解 {x1,x2,x3,,xn}
我们对于每个变量都加上一个相同的值变为 {x1+d,x2+d,x3+d,,xn+d}
不难发现仍然是满足原不等式组的。
那么现在考虑什么情况下无解。

对于这样一个不等式组:

{x1x23x2x35x3x11

由第一个和第二个不等式相加可以推出 x1x32
然而再和第三个不等式相加一下会变成 01,显然无解。
扩展一下,对于这样一个不等式组:

{x1x2c1x2x3c2xn1xncn1xnx1cn

把这 n 个不等式全部相加会变成 0ci,当且仅当 ci<0时无解。
那么可以发现,这在图上对应了一个负环
所以当且仅当建出来的图上存在负环时无解
判负环用 SPFA,对于不连通的图,添加一个超级源点
从超级源点向所有点连权值为 0 的边,然后从超级源点跑最短路即可。
若无负环,跑出来的 dis 数组即为一组解。

那么这道板子题,我们就解决了。
代码见:笔者的板子库

但是还不够。
当我们固定源点的值后,我们就可以求出所有点与源点的差的最值
最小值,则跑最长路,求出一个 disux 的下界。
(这里最长路可以把图的边权全部取相反数,再跑最短路算出)
最大值,则跑最短路,求出一个 disux 的上界。

如果要求所有变量和的最值呢?
例如令所有变量都为非负整数,求最小的变量和(见下面的习题)。
求最小值,我们跑最长路。
一个 xixj+c 的式子,变为图上一条从 j 连向 i,权值为 c 的边(与小于号的形式类似)
建立超级源点,向各点连权值为 0 的边,并钦定该源点的值为 0 (在代码里体现为dis[0] = 0),相当于让各个点的值都非负。
接下来从超级源点跑最长路,发现 dis 数组正好就是每个点能取的最小值,求和即为答案。

总结一下
由于通常要跑 SPFA,所以差分约束的数据范围一般不会太大。
先确定要跑什么路,再建图。
重点在于建图的时候不要漏掉题目中的隐藏条件

习题

YbtOj 1509 Intervals

对于 05×104 的每个值建一个变量 si 表示前缀和。
则题目中的条件可变为 sbsa1c
注意隐藏条件:sisi+1 以及 si+1si1
建超级源点跑最长路,答案即为 s5×104

细节:
由于有 s1 存在,对于所有节点编号加一再建图。

Luogu P3275 【SCOI2011】 糖果

求最小变量和,跑最长路。
根据题意建图,对于 xa<xb 的条件变为 xaxb1
见超级源点跑最长路,答案为 disi

这道题数据范围较大,差分约束会被 Hack 掉
然而笔者特判自环 + SPFA SLF-swap优化冲过去了

USACO 05DEC Layout G

di 表示前缀距离。
按照题意建图,隐藏条件 didi+10
建超级源点跑最短路,有负环则无解。
对于 1 号节点跑最短路,若与 n 号节点联通则 disn 即为答案,否则两点间距离可以任意大。

posted @   Sugar_Cube  阅读(936)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示