浅谈差分约束系统

版权声明:本文为作者原创,若转载请注明地址。 https://blog.csdn.net/chenxiaoran666/article/details/82083724

前言

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


一道例题

下面是一组不等式:

(①) A B 5 (②) B E 7 (③) A E 6 (④) D A 9 (⑤) B C 6 (⑥) C E 2

现在问你一个问题: A E 的最小值是多少
其实在这组不等式中,我们有很多方法得到一个形如 A E x 的式子:

  • 第一种方法:由③式直接得 A E 6
  • 第二种方法:①+②得 A E 12
  • 第三种方法:①+⑤+⑥得 A E 13

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


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

通过我们刚才的解题步骤,我们可以总结归纳出一个解决该类问题的通用方法,也就是差分约束系统
我们刚才通过 A B 5 B C 6 C E 2 来求出了 A E 13 ,仔细观察可以发现,相邻的两个式子中都有一个相同的字母,而我们正是借助了这个字母来实现转移的。
是不是有一种熟悉的感觉?
这不就是最长路径嘛!
没错,对于一个类似于 A B x 的式子,我们可以从 B A 连一条有向边,且这条边的边权为 x
这样,对于上面这个问题,我们只需求出 E A 的最长路即可。


不等式的转换

对于 A B x 的式子,我们是从 B A 连边求最长路,而对于 A B x ,则需从 A B 连边求最短路。
有一个要注意的地方,就是一张图你的式子要么全是 A B x 的形式,要么全是 A B x 的形式,不然你就无法用差分约束系统来求解答案了。
那么如果题目中给出多种式子呢?就不能用差分约束系统了吗?
不然,其实我们可以将这些式子全部转化为同一种式子( A B x A B x ,下面以 A B x 为例):

  • A = B :这个式子可以拆成 A B B A ,再转换一下就变成了 A B 0 B A 0
  • A B :这个式子可以转换成 B A 0
  • A B :这个式子可以转换成 A B 0
  • A < B :这个式子可以改写成 A B 1 ,再转换一下就变成了 B A 1
  • A > B :这个式子可以改写成 A 1 B ,再转换一下就变成了 A B 1
  • A B x :这个式子可以转换成 B A x
  • A B x :这个式子不用转换
  • A B < x :这个式子可以改写成 B A > x ,再转换一下就变成了 B A 1 x
  • A B > x :这个式子可以转换成 A B x + 1

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


例题

【洛谷1993】小K的农场
【洛谷3275】[SCOI2011]糖果

【洛谷1993】小K的农场 的题解详见博客【洛谷1993】小K的农场(差分约束系统模板题)
【洛谷3275】[SCOI2011]糖果 的题解详见博客【洛谷3275】[SCOI2011]糖果(差分约束系统入门题)

猜你喜欢

转载自blog.csdn.net/chenxiaoran666/article/details/82083724