基于最短路的差分约束模型

1. 差分约束的功能

  • 不等式组的可行解
  • 满足不等式组每一个变量的最值

不等式组中每一个不等式形式如下:

xixj+ck

其中,xixj 是自变量, ck是因变量。

我们可以类比一下之前的最短路问题,假设存在一条从 j走到 i,边权为 c的边。在进行最短路计算时,只要遇到 dist[j]>dist[i]+c,我们就将 dist[j]更新为 dist[i]+c。因此,当做完最短路之后,对于所有的 j,都有 dist[j]dist[i]+c

如果给我们一个图,我们可以把每条边看成一个不等式,那么我们在这个图上求一遍起点到所有点的最短距离(注意从起点出发,一定能走到所有的边,因为如果走不到所有的点,就不可能完成求单源最短路的任务,就有个别点走不到嘛),求完之后每个边的不等式都是满足的。那么,任何一个最短路问题,都可以转换为一个不等式组。那么反过来也一样,一个不等式组也可以转换为一个最短路问题
数缺形时少直观,形少数时难入微-华罗庚

因此,我们在解不等式组问题的时候,遇到一个不等关系,就将它处理成为 xixj+ck的格式,然后建立 ji 权值为 ck的一条边。之后我们在这个图上,随便选择起点(该起点需要满足从该点出发,一定可以走遍所有的边,所以有时需要找一个超级源点,找不到一个可以能够到达所有点的起点,就没法按差分约束的方法来计算啦),求一下每个点到起点的最短距离,求完之后,所有的不等关系都会满足。

2.求不等式的可行解

综上所述,我们可以总结出差分约束求不等式可行解的做法:

源点需要满足的条件:从源点出发,一定可以走到所有边(某个点走不到没有关系,因为从数学的角度,某个点就是某一个变量,既然没有边与它相连,它就没有任何约束)。

步骤:
【1】先将每个不等式 xixj+c 转换成一条 ji 长度为 c 的一条边
【2】找一个虚拟源点,使得该源点一定可以遍历到所有边
【3】从虚拟源点求一遍 单源最短路

注意
并不是所有图都存在最短路,图中可能存在负环,如果存在负环对应到不等式中就是无解

因此,建图完毕以后,做一次最短路,只有两个结果:

  • 如果存在负环,那么该不等式组一定无解
  • 如果不存在负环,则 dist[i]就是原不等式组中 xi一个可行解

3. 求满足不等式组中每一个变量的最值

只记结论: 如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路。为什么呢?
以求xi的最大值为例:求所有从xi出发,构成不等式链 xixj+c1xk+c2+c1...c1+c2+...+ck,通过做最短路以后可以确定 xi的一系列上界,最终 xi的最大值就等于所有上界中的最小值。

最长路的建图方式和2节中最短路的建图方式一样,把不等式转换成 xixj+c, 建立一条 ji 长度为 c 的一条边(最短路只看,最长路只看)。

我们知道,如果不等式组中仅仅包含不同变量之间的大小关系,那么我们求出的可行解一定是一个包含变量的相对关系,它不存在一个极值的概念。

因此,一旦题目让我们求满足不等式关系的极值,那么一定会在不等式组中加入形如 xicxic 这样的条件(小于还是大于看求最短路还是最长路),这样才能确定最后不等式组的边界,得到极值。那么,如何处理形如这种单变量常数关系呢?

【问题】如何转化形如 xic,其中 c是一个常数的这类关系?
答:建立一个虚拟源点 0,转换为 xix0+c,然后建立 0i,长度是 c的边。

posted @   糖豆爸爸  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-03-27 WINDOWS两条线路上网的解决办法
2018-03-27 准备运营的卡号生成办法
Live2D
点击右上角即可分享
微信分享提示