文章目录
差分约束 - 详细讲解 + 例题
一、差分约束
差 分 约 束 主 要 是 解 决 形 如 : x i ≤ x j + k 组 成 的 不 等 式 组 的 一 组 可 行 解 或 最 优 解 。 差分约束主要是解决形如:x_i≤x_j+k组成的不等式组的一组可行解或最优解。 差分约束主要是解决形如:xi≤xj+k组成的不等式组的一组可行解或最优解。
通 常 是 通 过 最 短 路 算 法 来 解 决 。 通常是通过最短路算法来解决。 通常是通过最短路算法来解决。
1、说明
设 有 n 个 变 量 和 m 个 不 等 关 系 构 成 的 不 等 式 组 : 设有n个变量和m个不等关系构成的不等式组: 设有n个变量和m个不等关系构成的不等式组:
{ x 1 ≤ x 2 + w 1 x 2 ≤ x i + w 2 . . . x i ≤ x j + w i . . . x j ≤ x n + w j , 1 ≤ i , j ≤ n 。 1 − ( 1 ) \begin{cases} x_{1}≤x_{2}+w_1\\x_{2}≤x_{i}+w_2\\...\\x_{i}≤x_{j}+w_i\\...\\x_{j}≤x_{n}+w_{j}\end{cases},1≤i,j≤n。\qquad\qquad1-(1) ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧x1≤x2+w1x2≤xi+w2...xi≤xj+wi...xj≤xn+wj,1≤i,j≤n。1−(1)
我 们 观 察 不 等 式 形 式 : x i ≤ x j + k 我们观察不等式形式:x_i≤x_j+k 我们观察不等式形式:xi≤xj+k
假 设 有 n 个 点 和 m 条 边 的 有 向 图 , 点 j 和 i 之 间 存 在 一 条 权 值 为 k 的 有 向 边 。 假设有n个点和m条边的有向图,点j和i之间存在一条权值为k的有向边。 假设有n个点和m条边的有向图,点j和i之间存在一条权值为k的有向边。
d i s [ i ] 表 示 从 源 点 到 i 的 最 短 距 离 。 dis[i]表示从源点到i的最短距离。 dis[i]表示从源点到i的最短距离。
若 d i s [ j ] + k < d i s [ i ] , 则 我 们 需 要 借 助 j 点 进 行 松 弛 操 作 。 若dis[j]+k<dis[i],则我们需要借助j点进行松弛操作。 若dis[j]+k<dis[i],则我们需要借助j点进行松弛操作。
即 更 新 d i s [ i ] = d i s [ j ] + k 。 即更新dis[i]=dis[j]+k。 即更新dis[i]=dis[j]+k。
当 整 个 最 短 路 算 法 完 成 后 , 必 有 不 等 关 系 d i s [ i ] ≤ d i s [ j ] + k 。 当整个最短路算法完成后,必有不等关系dis[i]≤dis[j]+k。 当整个最短路算法完成后,必有不等关系dis[i]≤dis[j]+k。
因 此 , 我 们 可 以 将 整 个 不 等 式 组 看 作 是 一 个 图 , 将 不 等 关 系 看 作 是 一 条 条 边 。 因此,我们可以将整个不等式组看作是一个图,将不等关系看作是一条条边。 因此,我们可以将整个不等式组看作是一个图,将不等关系看作是一条条边。
这 样 , 根 据 不 等 式 组 建 图 后 , 跑 一 遍 最 短 路 , 就 能 够 得 到 满 足 不 等 式 组 一 组 可 行 解 ( d i s [ 1 ] , d i s [ 2 ] , . . . , d i s [ n ] ) 。 这样,根据不等式组建图后,跑一遍最短路,就能够得到满足不等式组一组可行解(dis[1],dis[2],...,dis[n])。 这样,根据不等式组建图后,跑一遍最短路,就能够得到满足不等式组一组可行解(dis[1],dis[2],...,dis[n])。
当 然 , 前 提 是 有 解 。 当然,前提是有解。 当然,前提是有解。
当 图 中 存 在 负 环 时 , 我 们 是 不 能 够 通 过 最 短 路 算 法 得 到 可 行 解 的 。 对 应 的 方 程 组 也 是 无 解 的 。 当图中存在负环时,我们是不能够通过最短路算法得到可行解的。对应的方程组也是无解的。 当图中存在负环时,我们是不能够通过最短路算法得到可行解的。对应的方程组也是无解的。
原因:
根 据 上 述 方 程 组 , 根据上述方程组, 根据上述方程组,
有 不 等 关 系 : x 1 ≤ x 2 + w 1 ≤ x i + w 2 + w 1 ≤ x j + w i + w 2 + w 1 ≤ x n + w j + w i + w 2 + w 1 。 有不等关系:x_1≤x_2+w_1≤x_i+w_2+w_1≤x_j+w_i+w_2+w_1≤x_n+w_j+w_i+w_2+w_1。 有不等关系:x1≤x2+w1≤xi+w2+w1≤xj+wi+w2+w1≤xn+wj+wi+w2+w1。
这 对 应 一 条 从 x n 到 x 1 的 路 径 : x n − > x j − > x i − > x 2 − > x 1 。 这对应一条从x_n到x_1的路径:x_n->x_j->x_i->x_2->x_1。 这对应一条从xn到x1的路径:xn−>xj−>xi−>x2−>x1。
假 设 有 不 等 关 系 x n ≤ x 1 + w n , 则 有 x 1 ≤ x 1 + w n + w j + w i + w 2 + w 1 , 假设有不等关系x_n≤x_1+w_n,则有x_1≤x_1+w_n+w_j+w_i+w_2+w_1, 假设有不等关系xn≤x1+wn,则有x1≤x1+wn+wj+wi+w2+w1,
即 w n + w j + w i + w 2 + w 1 ≥ 0 , 即w_n+w_j+w_i+w_2+w_1≥0, 即wn+wj+wi+w2+w1≥0,
对 应 环 : x n − > x j − > x i − > x 2 − > x 1 − > x n 。 对应环:x_n->x_j->x_i->x_2->x_1->x_n。 对应环:xn−>xj−>xi−>x2−>x1−>xn。
若 该 环 为 负 环 , 即 w n + w j + w i + w 2 + w 1 < 0 , 就 与 约 束 条 件 冲 突 了 。 若该环为负环,即w_n+w_j+w_i+w_2+w_1<0,就与约束条件冲突了。 若该环为负环,即wn+wj+wi+w2+w1<0,就与约束条件冲突了。
因 此 , 若 图 中 存 在 负 环 , 则 方 程 组 无 可 行 解 。 因此,若图中存在负环,则方程组无可行解。 因此,若图中存在负环,则方程组无可行解。
源点的选取:
源 点 的 选 取 不 是 任 意 的 。 源点的选取不是任意的。 源点的选取不是任意的。
因 为 是 有 向 图 , 所 以 并 非 每 个 点 都 能 够 到 达 剩 下 的 所 有 点 , 就 未 必 能 够 更 新 到 所 有 边 , 即 所 有 不 等 关 系 。 因为是有向图,所以并非每个点都能够到达剩下的所有点,就未必能够更新到所有边,即所有不等关系。 因为是有向图,所以并非每个点都能够到达剩下的所有点,就未必能够更新到所有边,即所有不等关系。
故 我 们 需 要 选 择 一 个 能 够 到 达 图 中 所 有 点 的 点 , 作 为 源 点 。 故我们需要选择一个能够到达图中所有点的点,作为源点。 故我们需要选择一个能够到达图中所有点的点,作为源点。
若 不 容 易 找 到 某 个 点 作 为 源 点 , 通 常 会 设 置 虚 拟 源 点 0 号 点 。 若不容易找到某个点作为源点,通常会设置虚拟源点0号点。 若不容易找到某个点作为源点,通常会设置虚拟源点0号点。
2、求不等式组的可行解
步骤:
① 、 将 每 个 不 等 式 x i ≤ x j + k 转 化 为 一 条 从 j 走 到 i , 权 值 为 k 的 边 。 ①、将每个不等式x_i≤x_j+k转化为一条从j走到i,权值为k的边。 ①、将每个不等式xi≤xj+k转化为一条从j走到i,权值为k的边。
② 、 选 取 某 个 源 点 , 满 足 从 该 源 点 出 发 一 定 可 以 遍 历 所 有 边 。 ②、选取某个源点,满足从该源点出发一定可以遍历所有边。 ②、选取某个源点,满足从该源点出发一定可以遍历所有边。
③ 、 求 单 源 最 短 路 。 ③、求单源最短路。 ③、求单源最短路。
Ⅰ 、 若 存 在 负 环 , 则 原 不 等 式 组 无 解 。 \qquadⅠ、若存在负环,则原不等式组无解。 Ⅰ、若存在负环,则原不等式组无解。
Ⅱ 、 若 无 负 环 , 则 距 离 数 组 d i s 就 是 原 不 等 式 组 的 一 个 可 行 解 。 \qquadⅡ、若无负环,则距离数组dis就是原不等式组的一个可行解。 Ⅱ、若无负环,则距离数组dis就是原不等式组的一个可行解。
3、求可行解中的最值解(每个dis[i]的最值)
① 、 求 最 小 值 , 等 价 于 求 最 长 路 。 ①、求最小值,等价于求最长路。 ①、求最小值,等价于求最长路。
② 、 求 最 大 值 , 等 价 于 求 最 短 路 。 ②、求最大值,等价于求最短路。 ②、求最大值,等价于求最短路。
原因:
以 1 − ( 1 ) 方 程 组 为 例 , 最 终 能 够 得 到 : 以1-(1)方程组为例,最终能够得到: 以1−(1)方程组为例,最终能够得到:
{ x j ≤ x n + w j x i ≤ x n + w j + w i x 2 ≤ x n + w j + w i + w 2 x 1 ≤ x n + w j + w i + w 2 + w 1 \begin{cases}x_j≤x_n+w_j\\ \\ x_i≤x_n+w_j+w_i\\ \\ x_2≤x_n+w_j+w_i+w_2\\ \\ x_1≤x_n+w_j+w_i+w_2+w_1 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧xj≤xn+wjxi≤xn+wj+wix2≤xn+wj+wi+w2x1≤xn+wj+wi+w2+w1
即 从 其 他 点 与 点 n 之 间 的 约 束 关 系 。 即从其他点与点n之间的约束关系。 即从其他点与点n之间的约束关系。
若 x n 确 定 , 则 x j 、 x i 、 x 2 、 x 1 的 最 大 值 也 随 之 确 定 。 若x_n确定,则x_j、x_i、x_2、x_1的最大值也随之确定。 若xn确定,则xj、xi、x2、x1的最大值也随之确定。
若 我 们 以 n 为 源 点 跑 最 短 路 , 初 始 化 d i s [ n ] = 0 , 就 能 够 得 到 点 j 、 i 、 2 、 1 到 n 的 最 短 距 离 : 若我们以n为源点跑最短路,初始化dis[n]=0,就能够得到点j、i、2、1到n的最短距离: 若我们以n为源点跑最短路,初始化dis[n]=0,就能够得到点j、i、2、1到n的最短距离:
{ d i s [ j ] = w j d i s [ i ] = w j + w i d i s [ 2 ] = w j + w i + w 2 d i s [ 1 ] = w j + w i + w 2 + w 1 \begin{cases}dis[j]=w_j\\ \\ dis[i]=w_j+w_i\\ \\ dis[2]=w_j+w_i+w_2\\ \\ dis[1]=w_j+w_i+w_2+w_1 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧dis[j]=wjdis[i]=wj+widis[2]=wj+wi+w2dis[1]=wj+wi+w2+w1
故 最 短 路 能 够 求 方 程 组 可 行 解 的 最 大 值 。 故最短路能够求方程组可行解的最大值。 故最短路能够求方程组可行解的最大值。
最 终 求 得 的 所 有 关 于 x i 的 约 束 条 件 中 的 最 小 值 就 是 x i 的 最 大 值 。 最终求得的所有关于x_i的约束条件中的最小值就是x_i的最大值。 最终求得的所有关于xi的约束条件中的最小值就是xi的最大值。
如 : { x ≤ 2 x ≤ 1 , = > x ≤ 1 。 如:\begin{cases}x≤2\\x≤1\end{cases},=>x≤1。 如:{x≤2x≤1,=>x≤1。
二、例题
1、SCOI 2011 - 糖果 - 洛谷 P3275
2、Intervals - POJ 1201
3、Layout - POJ 3169
4、Cashier Employment - POJ 1275
差分约束 - Cashier Employment - POJ 1275
三、总结
① 、 边 权 无 限 制 : 用 s p f a 跑 最 短 路 / 最 长 路 。 时 间 复 杂 度 O ( n m ) 。 ①、边权无限制:用spfa跑最短路/最长路。时间复杂度O(nm)。 ①、边权无限制:用spfa跑最短路/最长路。时间复杂度O(nm)。
② 、 边 权 非 负 : t a r j a n 缩 点 + t o p s o r t 。 时 间 复 杂 度 O ( n + m ) 。 ②、边权非负:tarjan缩点+topsort。时间复杂度O(n+m)。 ②、边权非负:tarjan缩点+topsort。时间复杂度O(n+m)。
例 题 : \qquad例题: 例题:Tarjan(强连通分量缩点) - SCOI 2011 - 糖果 - 洛谷 P3275
③ 、 边 权 恒 正 : t o p s o r t , 时 间 复 杂 度 O ( n + m ) 。 ③、边权恒正:topsort,时间复杂度O(n+m)。 ③、边权恒正:topsort,时间复杂度O(n+m)。
例 题 : \qquad例题: 例题:拓扑排序(差分约束) - Reward - HDU 2647
例 题 : \qquad例题: 例题:拓扑排序(差分约束) - NOIP 2013 车站分级 - 洛谷 P1983