差分约束系统
差分约束系统是一种特殊的 N 元一次不等式组。它包含 N 个变量 X1~XN 以及 M 个约束条件,每个约束条件都是由两个变量作差构成的,形如 Xi-Xj≤ck,,其中 ck 是常数(可以是非负数,也可以是负数),1≤i,j≤N,1≤k≤M。我们要解决的问题就是:
求一组解 X1=a1,X2=a2,…,XN=aN,使所有约束条件都得到满足。
1:求不等式组的可行解:(建图转换为单源最短路问题)
差分约束系统的每个约束条件 Xi-Xj≤ck 可以变形为 Xi≤Xj+ck。这与单源最短路径问题中的三角形不等式 dist[y]≤dist[x]+z 非常相似。因此,可以把每个变量 X;看作有向图中的一个节点 i,对于每个约束条件 Xi-Xj≤ck,从节点 j 向节点 i 连一条长度为 ck 的有向边。
注意到如果 {a1,a2,…,aN} 是一组解,那么对任意的常数 Δ,{a1+Δ,…,a_N+Δ} 显然也是一组解(作差后 Δ 恰好被消掉)所以,不妨先求一组负数解, 即假设 对于任意的 i,X_i≤0 ,然后再增加一个 0 号节点,令 X_0=0。这样一来,就多了 N 个形如 X_i-X_0≤0 的约束条件,应该从节点 0 向每个节点 i 连一条长度为 0 的有向边。
设 dist[0] = 0,以0为起点求单源最短路。若图中存在负环,则给定的差分约束系统无解。否则, X_i= dist[i] 就是差分约束系统的一组解。
综上:求一组可行解时。
- 将每个不等式 X_i≤X_j+c_k 转换成一条从 X_j 走到 X_i ,长度为 c_k 的边。
- 找一个源点:该源点必须可以走到所有边。
- 从源点开始求一遍单源最短路。若图中存在负环,则无解。
在某些题目中,约束条件形如 X_i - X_j≥c_k。我们仍然可以从 j 到 i 连长度为 c_k 的有向边,只是改为计算单源最长路,若图中有正环则无解。当然,我们也可以把约束条件转化成 X_j-X_i≤-c_k,再按照单源最短路进行计算。
2:如何求可行解的最大值和最小值 (这里的最值是指每变量的最值)
- 如果求得是 最大值(下确界),则应该求最短路。
- 如果求得时 最小值(上确界)(至少),则应该求最长路。
做题时应特别注意题目中的隐含条件(不等式)