码迷,mamicode.com
首页 > 其他好文 > 详细

差分约束系统

时间:2017-07-31 13:29:23      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:span   最小   枚举   最短路   处理   第一个   判断   构造   for   

  网上的资料或多或少地缺乏一些完整性, 那么我也来一份缺乏完整性(大雾)的总结.

 

差分约束系统的概念

  设 $X = \left\{ x_1, x_2, ..., x_n \right\}$ .

  满足若干个形如 $x_i - x_j \ge w$ 的限制条件.

  解 $X$ .

 

  解一个问题有三个大的层次:

    ① 是否存在解? 构造任意一组解? 构造一组特殊解?

    ② 解的个数?

    ③ 解出所有?

  在我所能接触到的, 差分约束系统能完美地在多项式的时间复杂度内解决第一个层次, 而层次二和层次三就不行.

 

等价建图

  转化为图论的模型进行处理.

  对于任意的 $x_i$ , 设对应编号为 $i$ 的点.

  对于限制条件 $x_i - x_j \ge w$ , 连边 $i \rightarrow j$ , 边权为 $w$ .

 

解的存在性与构造任意一组解

  当图中存在负权回路时, 说明对于点 $i$ , 有 $w > 0, x_i - w \ge x_i$ , 所以一定无解.

  否则我们可以构造性地证明一定有解:

    令 $x_1, x_2, ..., x_n$ 的初始值为 $0$ .

    每次不断地选出一个点 $i$ , 枚举它的所有边 $(i, j, w)$ , 尝试进行松弛:

      如果 $x_i + w \ge x_j$ , 那么令 $x_j = x_i + w$ .

    如此迭代下去, 由于不存在负权回路, 所以一定会停止.

 

  我们发现这里的算法和最短路是等价的:

    对于判断负权回路, 可以用 SPFA 或 Floyd.

    对于迭代松弛, 可以用 SPFA 或 Floyd.

  所以直接用 SPFA 或者 Floyd 即可.

 

  总结一下, 我们解决了第一层次的两个小问题:

    (1) 解的存在性;

    (2) 构造任意一组解.

 

构造最大化 与某点差值 的解

  将问题再具体地描述一下:

    给定 $i$ , 构造 $\forall j, x_j - x_i$ 最大的解 $X$ .

  对于 $x_j < x_i$ , 最小化了差距 $|x_j - x_i|$ .

  对于 $x_j > x_i$ , 最大化了差距 $|x_j - x_i|$ .

 

  我们的做法是: 跑以 $i$ 为源点的单源最短路.

  因为对于任意的 $x_j$ , 在满足所有限制条件 "$\ge$" 下, 尽可能的大.

 

构造最小化 最大值与最小值的差距 的解

  构造 $\max_j x_j - \min_j x_j$ 最小的解.

 

  这里的做法就是构造性证明的做法.

  我们最初对 $x_1, x_2, ..., x_n$ 都赋成 $0$ .

  跑最短路下来, 对于 $x_i < 0$ , 其必然也尽可能的大.

  所以最小化的差距即为最终的 $\min_{j}(-x_j)$ .

差分约束系统

标签:span   最小   枚举   最短路   处理   第一个   判断   构造   for   

原文地址:http://www.cnblogs.com/Sdchr/p/7262477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!