C++基础:差分约束系统

本文介绍了如何使用C++通过差分约束系统求解三角不等式组。首先,将不等式转换为单源最短路问题,通过添加超级源点确保遍历所有边。接着,通过SPFA算法判断是否存在负环,从而确定不等式组是否有解。最后,根据求最小值或最大值的需求调整最长路或最短路的计算。代码示例展示了具体的实现过程。
摘要由CSDN通过智能技术生成

基本思路:利用最短路中di≤dj+c(j指向i,边权为c,此指算法结束后)将求解三角不等式组转换为(单源)最短路问题

三角不等式(组): xi≤xj+ck   其中xi、xj是自变量,ck是常量

差分约束系统有如下功能:

  • 求不等式组的可行解

源点需要满足条件:从原点出发,一定可以走到所有的边。故可设“超级源点”

超级源点:与每一个点相连的虚拟源点

步骤:

  1. 先将每个不等式xi≤xj+ck转化成一条从xj走向xi,长度为ck的一条边
  2. 找一个超级源点,使得该院点一定可以遍历到所有边
  3. 从源点求一边单源最短路

结果:

  1. 如果存在负环,则该不等式组无解
  2. 如果不存在负环,则di就是原不等式组的一个可行解

当然,求最长路亦可,需将原不等式变形为xj≥xi-ck,再将最短路不等式转化为di≥dj+ck,相当于连一条从xi走向xj、长度是-ck的边

  • 求不等式组解的最大值或最小值

结论:

  1. 如果求的是最小值,则应该求最长路(所有下界的最大值)
  2. 如果求的是最大值,就应该求最短路(所有上界的最小值)

问题1:如何转化xi≤c,其中c为常数?

解决1:以有向图为例利用超级源点x0,使xi≤x0+c,然后建立x0—>xi,长度是c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值