差分约束转最短路径概述

简介: 差分约束系统   整理自:http://ycool.com/post/m2uybbf。   如果一个系统由n个变量和m个约束条件组成,其中每个约束条件都形如xj-xi<=bk,(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。   求解差分约

差分约束系统

  整理自:http://ycool.com/post/m2uybbf

  如果一个系统由n个变量和m个约束条件组成,其中每个约束条件都形如xj-xi<=bk(i,j[1,n],k[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。

  求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。

  比如有这样一组不等式,不等式组(1)

X1 - X2 <= 0

X1 - X5 <= -1

X2 - X5 <= 1

X3 - X1 <= 5

X4 - X1 <= 4

X4 - X3 <= -1

X5 - X3 <= -3

X5 - X4 <= -3

  全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。

  这个不等式组要么无解,要么就有无数组解。因为如果有一组解{X1, X2, ..., Xn}的话,那么对于任何一个常数k{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,因为任何两个数同时加一个数之后,它们的差是不变的,那么这个差分约束系统中的所有不等式都不会被破坏。

    差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有:d(v) <= d(u) + w(u, v),其中d(u)d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。

  显然以上不等式就是d(v) - d(u) <= w(u, v)。这个形式正好和差分约束系统中的不等式形式相同。于是我们就可以把一个差分约束系统转化成一张图,每个未知数Xi对应图中的一个顶点Vi,把所有不等式都化成图中的一条边。对于不等式Xi - Xj <= c,就可以化成边Vj -> Vi,权值为c。最后,我们在这张图上求一次单源最短路径,这些三角形不等式就会全部都满足了,因为它是最短路径问题的基本性质嘛。

  话说回来,所谓单源最短路径,当然要有一个源点,然后再求这个源点到其他所有点的最短路径。那么源点在哪呢?我们不妨自已造一个X0=0

  添加n个不等式Xn - X0 <= 0,于是这个差分约束系统中就多出了下列不等式,不等式组(2):   

X1 - X0 <= 0

X2 - X0 <= 0

X3 - X0 <= 0

X4 - X0 <= 0

X5 - X0 <= 0

对于这5个不等式,也在图中建出相应的边。最后形成的图如下:

 

  图中的每一条边都代表差分约束系统中的一个不等式。现在以V0为源点,求单源最短路径。最终得到的V0Vn的最短路径长度就是Xn的一个解啦。从图中可以看到,这组解是{-5, -3, 0, -1, -4}。当然把每个数都加上10也是一组解:{5, 7, 10, 9, 6}。但是这组解只满足不等式组(1),也就是原先的差分约束系统;而不满足不等式组(2),也就是我们后来加上去的那些不等式。当然这是无关紧要的,因为X0本来就是个局外人,是我们后来加上去的,满不满足与X0有关的不等式我们并不在乎。

  也有可能出现无解的情况,也就是从源点到某一个顶点不存在最短路径。也说是图中存在负权的圈。

目录
相关文章
|
4月前
|
算法
Floyd 最短路径【学习算法】
Floyd 最短路径【学习算法】
51 0
|
3月前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
56 1
|
3月前
|
搜索推荐 Java
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
|
4月前
|
机器学习/深度学习 人工智能 算法
【图论 单源最短路】100276. 最短路径中的边
【图论 单源最短路】100276. 最短路径中的边
|
算法
最短路径之基于贪心算法的迪杰斯特拉dijkstra算法(有图解,含码源)
最短路径之基于贪心算法的迪杰斯特拉dijkstra算法(有图解,含码源)
373 0
|
算法 C++
算法基础系列第三章——图论之最短路径问题(2)
算法基础系列第三章——图论之最短路径问题(2)
185 0
算法基础系列第三章——图论之最短路径问题(2)
|
算法 C++
算法基础系列第三章——图论之最短路径问题(1)
算法基础系列第三章——图论之最短路径问题(1)
171 0
算法基础系列第三章——图论之最短路径问题(1)
|
算法 C++ Python
BFS逛街算法模板-附LeetCode习题-433. 最小基因变化-广度优先搜索
BFS逛街算法模板-附LeetCode习题-433. 最小基因变化-广度优先搜索
|
算法
零基础学算法100天第1天——Dijkstra(图解最短路算法)(下)
零基础学算法100天第1天——Dijkstra(图解最短路算法)
193 0
零基础学算法100天第1天——Dijkstra(图解最短路算法)(下)
|
存储 算法 5G
零基础学算法100天第1天——Dijkstra(图解最短路算法)(上)
零基础学算法100天第1天——Dijkstra(图解最短路算法)
176 0
零基础学算法100天第1天——Dijkstra(图解最短路算法)(上)