差分约束系统

先来看一道例题

现有未知数 a1,a2,⋯,an ,有若干个形如 ai−aj≤k 的不等式构成的不等式组,求解这个不等式组的一组解。

一眼看下去,好像很难入手。

我们先把不等式整理一下:

ai−aj≤k=ai≤aj+k

等一下,是不是有点熟悉?

对于一个图的最短路,我们设 disi 表示源点到 i 的最短路,那么如果j−>i,那么满足: disi≤disj+Wi,j

等等,你发现了什么?

没错,对于这个不等式组,我们可以像图的最短路问题一样连边( ai−aj≤k 即 点j到 点 i 连一条边权为k的单向边),然后设一个源点s连向 a1,a2,⋯,an ,做一次最短路得出的{ disi }即为一组可行解。

像这样,由 n 个变量,有若干个形如ai−aj≤k约束的系统,就叫差分约束系统,像我们这样把它构成的图就叫做差分约束图。

再来看一组例题:

设有n个盒子标号为1…n,每个盒子最多放1个球。其中有若干个 [ai,bi,ci] 表示 ai ~ bi 最多可放 ci 个球,求这n个盒子最多可放多少个球。

这就是典型的求解有若干个形如 ai−aj≤k 条件约束的差分约束系统。

我们设 Si 表示 1 ~i放n个球,那么我们有:

0≤Sbi−Sai−1≤ci

0≤Si−Si−1≤1

按照上述方法连边,做一次最短路,所得的 disn 就是答案(可以证明一下为什么)。

至此我们大概了解了差分约束系统及其应用,这里还有一道例题:DY引擎。

posted @ 2016-06-20 20:10  sadstone  阅读(97)  评论(0)    收藏  举报