差分约束系统跑最长路&最短路的选择

最近在学差分约束系统,
总所周知,差分约束系统是用于求解不等式方程组用的,那么根据要求建图,但是建图之后应该选择跑最长路还是最短路呢?一般的blog上都是说根据题目要求。
但是我觉得,当你建图的时候使用的是s[x]-s[y]<=T形式的方程组建图时,即y向x连一条权值为T的边,应该选择跑最短路。
如果使用的是s[x]-s[y]>=T形式的方程组来建图时,应该选择跑最长路。
这是我在做了一些题目后总结出来的,有可能题目不够多,所以说服力不够强,但总可以试一试。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用Lingo求解最短路问题并加入径约束的代码: ```lingo model: sets: i /1*10/ j /1*10/ k /1*20/ constraints /1.BE 2.CF 3.DE 4.EG 5.GF/ parameters: c(i,j) / 1 2 3 2 4 1 3 4 2 5, 2 1 3 2 1 4 3 3 3 2, 2 3 1 4 2 5 1 2 4 3, 3 2 4 1 3 2 5 1 4 2, 4 1 2 3 1 4 2 3 2 3, 1 4 5 2 4 1 3 2 2 1, 3 3 1 5 2 3 1 4 3 2, 4 1 2 1 3 2 4 3 1 2, 2 2 4 4 2 1 3 2 2 3, 5 1 3 2 1 4 2 3 1 2 / f(i,j) / 10 30 20 40 60 10 20 10 30 50, 20 10 30 40 10 50 20 30 40 20, 30 20 10 50 40 60 10 30 20 40, 40 30 50 20 10 30 60 10 20 30, 50 10 20 30 20 10 40 30 30 20, 10 50 60 20 50 10 20 30 20 10, 20 40 30 10 30 20 50 20 40 30, 30 10 20 10 20 30 40 30 10 20, 10 20 50 40 30 10 20 30 20 20, 50 10 30 20 10 50 40 30 20 40 / start(i) /1/ end(i) /10/ variables: x(i,j) binary z equations: obj: z = sum((i,j), f(i,j)*x(i,j)) start_con: sum(j, x(start,j)) = 1 end_con: sum(i, x(i,end)) = 1 flow_con(i)$(not sameas(i,start) and not sameas(i,end)): sum(j, x(i,j)) - sum(j, x(j,i)) = 0 arc_con(i,j): x(i,j) + x(j,i) <= 1 subtour_con(k)$(card(k) gt 1): sum((i,j)$(ord(i) lt ord(j) and i in k and j in k), x(i,j)) <= card(k) - 1 path_con(i,j)$(index(constraints, str(i.j)) gt 0): x(i,j) = 0 model_name "ConstrainedShortestPath"; solve; display z, x; ``` 该模型中,`i`和`j`表示图的节点,`k`表示子集,`c(i,j)`表示节点i到节点j的距离,`f(i,j)`表示节点i到节点j的费用,`start(i)`表示起点,`end(i)`表示终点,`x(i,j)`表示是否选择从节点i到节点j的径,`z`表示最小费用。`constraints`表示径约束,这里包含5个约束径。模型的约束分别为:起点只有一条出边,终点只有一条入边,流量守恒约束,径是有向无环图,子集约束,径约束,目标函数为最小费用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值