标签: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