差分约束
定义
差分约束系统 是一种特殊的 元一次不等式组,它包含 个变量以及 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 ,并且 为常实数。
解决问题
求出该系统的(任意)一组解,或判断无解。
变形
每个约束条件 都可以变形成 ,这与单源最短路中的三角形不等式 非常相似。
建模
因此,我们可以把每个变量 看做图中的一个结点,对于每个约束条件:
从结点 向结点 连一条长度为 的有向边。
这样跑一遍最短路得出的 dist[] 数组就是满足当前约束条件的一组解。
可是最短路总要有个源点,注意到建立的图不一定是连通图,所以使用一个超级源点,向每个节点连一条边权为 的边。
为什么边权为零?
假设超级源点为 节点,根据最短路的定义 ,因此对于每个节点连一条边权为 的边就相当于添加了 个条件 。注意到,如果 是该差分约束系统的一组解,那么对于任意的常数 , 显然也是该差分约束系统的一组解,因为这样做差后 刚好被消掉,也就是说,差分约束得到的解是可以在数轴上任意平移的。
因为可行解可以任意平移,这些约束条件使得我们找到的是最大值为 的一组解,并不影响解的正确性。由此可知,边权为 只是一种被人们广泛接受的习惯,实际上它可以为 任意实数。赋值成 可以帮助人们理解并且避免解超出范围。
Code
Problem : P5960 【模板】差分约束
Application
P1260 工程规划
Analysis
相较于模版,本题额外要求:
对于有解的情况,要使最早进行的那个任务和整个工程的起始时间相同,也就是说,中至少有一个为 0。
这就用到了差分约束中解的平移性,我们可以设,,这样将每个解同时减去 ,就会得到一组合法的解(最小值等于0)