基于最短路的差分约束模型
1. 差分约束的功能
- 求不等式组的可行解
- 求满足不等式组的每一个变量的最值
不等式组中每一个不等式形式如下:
其中, 和 是自变量, 是因变量。
我们可以类比一下之前的最短路问题,假设存在一条从 走到 ,边权为 的边。在进行最短路计算时,只要遇到 ,我们就将 更新为 。因此,当做完最短路之后,对于所有的 ,都有 。
如果给我们一个图,我们可以把每条边看成一个不等式,那么我们在这个图上求一遍起点到所有点的最短距离(注意从起点出发,一定能走到所有的边,因为如果走不到所有的点,就不可能完成求单源最短路的任务,就有个别点走不到嘛),求完之后每个边的不等式都是满足的。那么,任何一个最短路问题,都可以转换为一个不等式组。那么反过来也一样,一个不等式组也可以转换为一个最短路问题。
数缺形时少直观,形少数时难入微-华罗庚
因此,我们在解不等式组问题的时候,遇到一个不等关系,就将它处理成为 的格式,然后建立 权值为 的一条边。之后我们在这个图上,随便选择起点(该起点需要满足从该点出发,一定可以走遍所有的边,所以有时需要找一个超级源点,找不到一个可以能够到达所有点的起点,就没法按差分约束的方法来计算啦),求一下每个点到起点的最短距离,求完之后,所有的不等关系都会满足。
2.求不等式的可行解
综上所述,我们可以总结出差分约束求不等式可行解的做法:
源点需要满足的条件:从源点出发,一定可以走到所有边(某个点走不到没有关系,因为从数学的角度,某个点就是某一个变量,既然没有边与它相连,它就没有任何约束)。
步骤:
【1】先将每个不等式 转换成一条 长度为 的一条边
【2】找一个虚拟源点,使得该源点一定可以遍历到所有边
【3】从虚拟源点求一遍 单源最短路
注意:
并不是所有图都存在最短路,图中可能存在负环,如果存在负环对应到不等式中就是无解。
因此,建图完毕以后,做一次最短路,只有两个结果:
- 如果存在负环,那么该不等式组一定无解
- 如果不存在负环,则 就是原不等式组中 的一个可行解
3. 求满足不等式组中每一个变量的最值
只记结论: 如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路。为什么呢?
以求的最大值为例:求所有从出发,构成不等式链 ,通过做最短路以后可以确定 的一系列上界,最终 的最大值就等于所有上界中的最小值。
最长路的建图方式和节中最短路的建图方式一样,把不等式转换成 , 建立一条 长度为 的一条边(最短路只看,最长路只看)。
我们知道,如果不等式组中仅仅包含不同变量之间的大小关系,那么我们求出的可行解一定是一个包含变量的相对关系,它不存在一个极值的概念。
因此,一旦题目让我们求满足不等式关系的极值,那么一定会在不等式组中加入形如 或 这样的条件(小于还是大于看求最短路还是最长路),这样才能确定最后不等式组的边界,得到极值。那么,如何处理形如这种单变量常数关系呢?
【问题】如何转化形如 ,其中 是一个常数的这类关系?
答:建立一个虚拟源点 ,转换为 ,然后建立 ,长度是 的边。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-03-27 WINDOWS两条线路上网的解决办法
2018-03-27 准备运营的卡号生成办法