差分约束系统

简单介绍一下差分约束系统:

对于形如

x1-x2<=c1

x1-x3<=c2

x2-x3<=c3

...

构成的不等式组,我们要求出其中的一组解向量(x1,x2,x3,...,xn)使得所有的不等式都成立,我们就可以用最短路算法来解出其中的一个解向量,然后给每个xi同时加上一个常数k,所有不等式仍然成立(两个数同时加上常数k,这两个数的差值不变),然后就求出了解集。

注意到在最短路中d[i]表示i到源点的最短路径长度。那么对于任意一条从u到v的边w(u,v),我们都有d[v]<=d[u]+w(u,v),变形得:

d[v]-d[u]<=w(u,v),这个不等式跟我们上面提到的不等式类似,那么我们就可以把不等式组中的所有未知数都看成一个点,然后建立约束图,这里建图的时候注意x1-x2<c1,我们要建的一条有向边是从x2->x1,然后边权为c1。

最后我们要求最短路了,那么最短路的源点是哪个呢。这里我们要假设一个超级源点x0,然后从超级源点出发到其他所有点都有一条有向边,且边权为0,就是说

x1-x0<=0

x2-x0<=0

...

那么我们就使得解向量的任意一个成员都成了非正数(要知道所有解加上一个常数还是符合条件的)。

然后我们求其他所有点到超级源点的最短路就成了。

特别注意dijkstra是不能处理负边权的图的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值