差分约束

基本概念

差分约束系统是一种特殊的\(n\)元一次不等式组,它包含\(n\)个变量\(x_1,x_2,...,x_n\)以及\(m\)个约束关系,每个约束条件由两个变量作差构成的,例如\(x_i-x_j\leq c_k\),其中\(1\leq i,j\leq n,i\neq j,1\leq k \leq n\)\(c_k\)为常数(可以是负数,也可以是非负数),我们要解决的问题是:求一组解\(x_1=a_1,x_2=a_2,...,x_n=a_n\),使得所有的约束条件都满足,否则判断出无解。

差分约束系统中的每个约束条件\(x_i-x_j\leq c_k\)都可以变形成\(x_i\leq x_j+c_k\),这与单源最短路中的三角形不等式\(dist[j]\leq dist[i]+w[i]\)非常相似。因此,我们可以把每个变量x_i看做图中的一个结点,对于每个约束条件\(x_i\leq x_j+c_k\),从结点\(x_i\)向结点\(x_j\)连一条长度为\(c_k\)的有向边。

有解的条件是:从某一个源点出发,一定可以走到所有的边(因为每一条边都是一个约束条件,点则可以是孤立点)


步骤

最大值:

1.先将每个不等式\(x_i\leq x_j+c_k\),转化成一条从\(x_j\)走到\(x_i\),长度为\(c_k\)的一条有向边。
2.找一个超级源点,使得该源点一定可以遍历到所有边。
3.从源点求一遍单源最短路径

  • 结果1:如果存在负环,则原不等式组一定无解。
  • 结果2:如果没有负环,则\(dist[i]\)就是原不等式组的一个可行解。

最小值:

1.先将每个不等式\(x_i\geq x_j+c_k\),转化成一条从\(x_j\)走到\(x_i\),长度为\(c_k\)的一条有向边。
2.找一个超级源点,使得该源点一定可以遍历到所有边。
3.从源点求一遍单源最长路径

  • 结果1:如果存在正环,则原不等式组一定无解。
  • 结果2:如果没有正环,则\(dist[i]\)就是原不等式组的一个可行解。

如何求解最大值最小值

这里的最值指的是每个变量的最值

  • 结论:如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路
  • 问题:如何转化\(x_i\leq c_k\),这类不等式。
  • 方法:建立一个超级原点\(0\),然后建立\(0->i\)长度为\(c_0\)的边即可。

以求\(x_i\)的最大值为例:求所有从\(x_i\)出发,构成不等式链\(x_i\leq x_j+c_1\leq x_k+c_2\leq ...\leq c_0+c_1+c_2+...\)即为所计算出上界,最终\(x_i\)的最大值等于所有上界的最小值。

典型例题

洛谷\(P3275\)[CSOI2011]糖果 题解

posted @ 2021-05-01 14:17  筱翼深凉  阅读(95)  评论(0编辑  收藏  举报