Different Constraints - 差分约束


问题

差分约束是这样一类线性约束:

上面的不等式可以转化为线性不等式:

进一步抽象为:

矩阵列,每一行有且仅有一个和一个,其余所有值都是。未解数矩阵列,依次为。常熟矩阵列,依次为

行不等式满足:

其中等于,且

这样的线性不等式组称为差分约束。

对于上面的差分约束,存在一组解:

对于任意常数,都有解:

即该差分约束的通解。

给定矩阵以及行数列数,求差分约束的解。

解法

差分约束是最短路径在线性规划上的典型应用之一。将差分约束转化为有向图

将所有不等式转化为有向图的边,权值为,共条边个顶点。再额外增加顶点,且顶点到其他个顶点都存在边,权值为,共条边。最终有向图个顶点条边。

通过Bellman Ford算法求出到其他所有顶点的最短路径。若其中存在某个顶点的最短路径,则说明该图不存在最短路径,对应的差分约束也不存在解;否则即为差分约束的解。即差分约束的解为:

该算法的时间复杂度与Bellman Ford算法相同,也是


Introduction To Algorithms


源码

DifferentConstraints.h

DifferentConstraints.cpp

测试

DifferentConstraintsTest.cpp