浅谈差分约束系统

前言

差分约束系统应该是一个比较有用的算法。它建立在图的思想上,常与最短(长)路算法一起出现。


一道例题

下面是一组不等式:

(①) A − B ≥ 5 A-B≥5\tag{①} AB5()

(②) B − E ≥ 7 B-E≥7\tag{②} BE7()

(③) A − E ≥ 6 A-E≥6\tag{③} AE6()

(④) D − A ≥ 9 D-A≥9\tag{④} DA9()

(⑤) B − C ≥ 6 B-C≥6\tag{⑤} BC6()

(⑥) C − E ≥ 2 C-E≥2\tag{⑥} CE2()

现在问你一个问题: A − E A-E AE的最小值是多少

其实在这组不等式中,我们有很多方法得到一个形如 A − E ≥ x A-E≥x AEx的式子:

  • 第一种方法:由③式直接得 A − E ≥ 6 A-E≥6 AE6

  • 第二种方法:①+②得 A − E ≥ 12 A-E≥12 AE12

  • 第三种方法:①+⑤+⑥得 A − E ≥ 13 A-E≥13 AE13

因此,我们可以求出答案: A − E A-E AE的最小值是13。


用差分约束系统来求解上面这个问题

通过我们刚才的解题步骤,我们可以总结归纳出一个解决该类问题的通用方法,也就是差分约束系统

我们刚才通过 A − B ≥ 5 A-B≥5 AB5 B − C ≥ 6 B-C≥6 BC6 C − E ≥ 2 C-E≥2 CE2来求出了 A − E ≥ 13 A-E≥13 AE13,仔细观察可以发现,相邻的两个式子中都有一个相同的字母,而我们正是借助了这个字母来实现转移的。

是不是有一种熟悉的感觉?

这不就是最长路径嘛!

没错,对于一个类似于 A − B ≥ x A-B≥x ABx的式子,我们可以从 B B B A A A连一条有向边,且这条边的边权为 x x x

这样,对于上面这个问题,我们只需求出 E E E A A A的最长路即可。


不等式的转换

对于 A − B ≥ x A-B≥x ABx的式子,我们是从 B B B A A A连边求最长路,而对于 A − B ≤ x A-B≤x ABx,则需从 A A A B B B连边求最短路。
有一个要注意的地方,就是一张图你的式子要么全是 A − B ≥ x A-B≥x ABx的形式,要么全是 A − B ≤ x A-B≤x ABx的形式,不然你就无法用差分约束系统来求解答案了。

那么如果题目中给出多种式子呢?就不能用差分约束系统了吗?

不然,其实我们可以将这些式子全部转化为同一种式子( A − B ≥ x A-B≥x ABx A − B ≤ x A-B≤x ABx,下面以 A − B ≥ x A-B≥x ABx为例):

  • A = B A=B A=B:这个式子可以拆成 A ≥ B A≥B AB B ≥ A B≥A BA,再转换一下就变成了 A − B ≥ 0 A-B≥0 AB0 B − A ≥ 0 B-A≥0 BA0
  • A ≤ B A≤B AB:这个式子可以转换成 B − A ≥ 0 B-A≥0 BA0
  • A ≥ B A≥B AB:这个式子可以转换成 A − B ≥ 0 A-B≥0 AB0
  • A < B A<B A<B:这个式子可以改写成 A ≤ B − 1 A≤B-1 AB1,再转换一下就变成了 B − A ≥ 1 B-A≥1 BA1
  • A > B A>B A>B:这个式子可以改写成 A − 1 ≥ B A-1≥B A1B,再转换一下就变成了 A − B ≥ 1 A-B≥1 AB1
  • A − B ≤ x A-B≤x ABx:这个式子可以转换成 B − A ≥ − x B-A≥-x BAx
  • A − B ≥ x A-B≥x ABx:这个式子不用转换
  • A − B < x A-B<x AB<x:这个式子可以改写成 B − A > − x B-A>-x BA>x,再转换一下就变成了 B − A ≥ 1 − x B-A≥1-x BA1x
  • A − B > x A-B>x AB>x:这个式子可以转换成 A − B ≥ x + 1 A-B≥x+1 ABx+1

这样,遇到给你一些不等式,请你求出两数之差的最大(最小)值的问题,就可以轻松解决了。


例题

【洛谷1993】小K的农场

【洛谷3275】[SCOI2011]糖果

L i n k Link Link

【洛谷1993】小K的农场 的题解详见博客【洛谷1993】小K的农场(差分约束系统模板题)

【洛谷3275】[SCOI2011]糖果 的题解详见博客【洛谷3275】[SCOI2011]糖果(差分约束系统入门题)

你可能感兴趣的:(差分约束)