差分约束算法总结

来自 https://blog.csdn.net/my_sunshine26/article/details/72849441

差分约束系统

一、概念

如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统。

二、引例

给定n个变量和m个不等式,每个不等式的形式为 x[i] - x[j] <= a[k] (0 <= i, j < n, 0 <= k < m, a[k]已知),求 x[i] - x[j] 的最大值。

例如当n = 4,m = 5,给出如下图所示的不等式组,求x3 - x0的最大值。

一般思路:我们可以尝试把几个不等式组合得到最后我们要求的式子,于是这些式子里最小的那个就是答案。

比如,在这个例子中:

(3) ==》  x3 - x0<=4;

(1)、(4)、(5) ==》 x3 - x0<=5;

(2)、(5) ==》 x3 - x0<=3;

所以最后结果就是3.

在这个过程中,我们是否想到这种方法与我们已经学的一种算法有所联系,是的,就是最短路算法。

三、差分约束与最短路模型

1、与最短路模型的联系

先给出结论:求解差分约束系统,都可以转化成图论的单源最短路径(或最长路径)问题。

我们观察上面例子中的不等式,都是x[i] - x[j] <= a[k],可以进行移项,成为x[i] <= x[j] + a[k],我们令a[k] = w(j, i),dis[i]=x[i],并使i=v,j=u,那么原始就变为:dis[u]+w(u,v)>=dis[v],于是可以联想到最短路模型中的一部分代码

  1. if(dis[u]+w(u,v)<=dis[v])

  2.  

    {

  3.  

    dis[v]=dis[u]+w(u,v);

  4.  

    }

这不正与松弛操作相似吗?

但是好像不等号方向刚好相反,但其实这并不矛盾

上面的代码要实现的是使dis[u]+w(u,v)>dis[v],而对于不等式,我们进行建边的操作:对于每个不等式 x[i] - x[j] <= a[k],对结点 j 和 i 建立一条 j -> i的有向边,边权为a[k],求x[n-1] - x[0] 的最大值就是求 0 到n-1的最短路,两者刚好吻合。所以求解差分约束问题就转化为了最短路问题。

2.问题解的存在性

由于在求解最短路时会出现存在负环或者终点根本不可达的情况,在求解差分约束问题时同样存在

(1)、存在负环

如果路径中出现负环,就表示最短路可以无限小,即不存在最短路,那么在不等式上的表现即X[n-1] - X[0] <= T中的T无限小,得出的结论就是 X[n-1] - X[0]的最大值不存在。在SPFA实现过程中体现为某一点的入队次数大于节点数。(貌似可以用sqrt(num_node)来代替减少运行时间)

(2)、终点不可达

这种情况表明X[n-1]和X[0]之间没有约束关系,X[n-1] - X[0]的最大值无限大,即X[n-1]和X[0]的取值有无限多种。在代码实现过程中体现为dis[n-1]=INF。

3、不等式组的转化

做题时可能会遇到不等式中的符号不相同的情况,但我们可以对它们进行适当的转化

(1)方程给出:X[n-1]-X[0]>=T ,可以进行移项转化为: X[0]-X[n-1]<=-T。

(2)方程给出:X[n-1]-X[0]<T, 可以转化为X[n-1]-X[0]<=T-1。

(3)方程给出:X[n-1]-X[0]=T,可以转化为X[n-1]-X[0]<=T&&X[n-1]-X[0]>=T,再利用(1)进行转化即可

4、应用

对于不同的题目,给出的条件都不一样,我们首先需要关注问题是什么,如果需要求的是两个变量差的最大值,那么需要将所有不等式转变成"<="的形式,建图后求最短路;相反,如果需要求的是两个变量差的最小值,那么需要将所有不等式转化成">=",建图后求最长路。

5、相关题目链接

(1)、POJ 1716 Integer Intervals

(2)、HDOJ 3666 THE MATRIX PROBLEM

--------------------- 本文来自 Dust_Heart 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/my_sunshine26/article/details/72849441?utm_source=copy 

原文地址:https://www.cnblogs.com/wjhstudy/p/9757046.html

时间: 2024-10-15 17:04:47

差分约束算法总结的相关文章

2018/2/10 每日一学 差分约束算法

差分约束算法 我们知道,对于一个最短路问题中的某边<u,v>,必定有d[v]<=d[u]+w,稍稍变形可得d[v]-d[u]<=w,是不是很像x1-x2<=a这种数学不等式? 所以对于一不等式组,我们可以将其转化为x1-x2<=a形式,连接一条有向边(X2->X1),权值为a,然后求最短路就行了. 注意如果对于负环的判断以及图的连通判断-- 刷点题再看看吧. 原文地址:https://www.cnblogs.com/Alex-leaves/p/8439751.ht

差分约束算法

(本文假设读者已经有以下知识:最短路径的基本性质.Bellman-Ford算法.)    比如有这样一组不等式: X1 - X2 <= 0X1 - X5 <= -1X2 - X5 <= 1X3 - X1 <= 5X4 - X1 <= 4X4 - X3 <= -1X5 - X3 <= -3X5 - X4 <= -3 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于).这样的不等式组就称作差分约束系统.  

【转载】夜深人静写算法(四)——差分约束

[转载]夜深人静写算法(四) - 差分约束  目录     一.引例       1.一类不等式组的解   二.最短路       1.Dijkstra       2.图的存储       3.链式前向星       4.Dijkstra + 优先队列       5.Bellman-Ford       6.SPFA       7.Floyd-Warshall   三.差分约束        1.数形结合        2.三角不等式        3.解的存在性        4.最大值

POJ 3169 Layout (差分约束)

题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个,D[i] - D[i+1] <= 0,  D[j] -D[i ]<= k, D[i] - D[j] <= - k,那么这个题就可以用差分约束来求这个不等式组了. 1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值(本题求的就

POJ 1364 King --差分约束第一题

题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析:典型差分约束题,变换,令Ti = SUM(Xj) (0<=j<=i).  则表达式(1)可以看做T(a+b)-T(a-1) > k,也就是T(a-1)-T(a+b) < -k,又因为全是整数,所以T(a-1)-T(a+b) <= -k-1.  同理,(2)看做T(a+b)-T(

【差分约束】Layout

Layout TimeLimit: 1000MS   MemoryLimit: 65536K       Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a straight line waiting for feed. The

[BZOJ2330]SCOI2011糖果|差分约束

差分约束题..学了一下差分约束,我觉得还是挺简单的,考虑f[u]-f[v]<=c,发现和最短路的松弛操作神似,最短路跑完之后对于一条边(v,u),显然有d[u]<=d[v]+c,不就是上面差分约束的式子吗..那就转化成最短(长)路做咯,以最短路为例了,对于每个f[u]-f[v]<=c,连一条v到u权值为c的边,然后跑最短路,如果有负环那就说明无解,没有的话跑完之后各点的d值就是解.. 对于本题,d[a]==d[b],有 d[a]-d[b]>=0, d[b]-d[a]>=0 d

shortpath3159差分约束

题目意思: flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发,在班上,flymouse和snoopy是死对头,两人势如水火,不能相容,因此fly希望自己分得的糖果数尽量多于snoopy,而对于其他小朋友而言,则只希望自己得到的糖果不少于班上某某其他人就行了. 比如A小朋友强烈希望自己的糖果数不能少于B小朋友m个,即B- A<=m,A,B分别为 A.B小朋友的分得的糖果数.因此根据题意,可以列出如下的不等式:         Sbi-Sai<=ci(

关于图论【差分约束】

其实这个是一个数形结合的绝妙算法,通过找到不等式和SPFA中更新d时的相同点,用最短路解决数学问题.CBL大佬太强啦,我已经找不到可以优化的,所以说就看看他的解释吧~ //差分约束的重点中的重点:约束式一定要化为y<=x+c的形式,否则模型直接的转换会出错 /* 差分约束系统的定义 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如x[j]-x[i]<=b[k](1<=i,j<=n),(1<=k<=m) 则称其为差分约束系统(system of differ