基本思路:利用最短路中di≤dj+c(j指向i,边权为c,此指算法结束后)将求解三角不等式组转换为(单源)最短路问题
三角不等式(组): xi≤xj+ck 其中xi、xj是自变量,ck是常量
差分约束系统有如下功能:
- 求不等式组的可行解
源点需要满足条件:从原点出发,一定可以走到所有的边。故可设“超级源点”
超级源点:与每一个点相连的虚拟源点
步骤:
- 先将每个不等式xi≤xj+ck转化成一条从xj走向xi,长度为ck的一条边
- 找一个超级源点,使得该院点一定可以遍历到所有边
- 从源点求一边单源最短路
结果:
- 如果存在负环,则该不等式组无解
- 如果不存在负环,则di就是原不等式组的一个可行解
当然,求最长路亦可,需将原不等式变形为xj≥xi-ck,再将最短路不等式转化为di≥dj+ck,相当于连一条从xi走向xj、长度是-ck的边
- 求不等式组解的最大值或最小值
结论:
- 如果求的是最小值,则应该求最长路(所有下界的最大值)
- 如果求的是最大值,就应该求最短路(所有上界的最小值)
问题1:如何转化xi≤c,其中c为常数?
解决1:以有向图为例利用超级源点x0,使xi≤x0+c,然后建立x0—>xi,长度是c