• 浅谈差分约束


    差分约束

    截取到的一个博客(只截取了我觉得好的部分):

    1、数形结合

    如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统。引例中的不等式组可以表示成如图三-1-1的系数矩阵。

    img

    图三-1-1

    然后继续回到单个不等式上来,观察 x[i] – x[j] <= a[k],

    将这个不等式稍稍变形,将x[j]移到不等式右边,则有x[i] <= x[j] + a[k],

    然后我们令a[k] = w(j, i),再将不等式中的i和j变量替换掉,i = v, j = u

    将x数组的名字改成d(以上都是等价变换,不会改变原有不等式的性质)

    则原先的不等式变成了以下形式:

    d[u] + w(u, v) >= d[v]。

    这时候联想到SPFA中的一个松弛操作:

    if(d[u] + w(u, v) < d[v]) {

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

    }

    对比上面的不等式,两个不等式的不等号正好相反,但是再仔细一想,其实它们的逻辑是一致的,因为SPFA的松弛操作是在满足小于的情况下进行松弛,力求达到d[u] + w(u, v) >= d[v],而我们之前令a[k] = w(j, i),所以我们可以将每个不等式转化成图上的有向边:对于每个不等式 x[i] – x[j] <= a[k],对结点 j 和 i 建立一条 j -> i的有向边,边权为a[k],求x[n-1] – x[0] 的最大值就是求 0 到n-1的最短路。

    img

    图三-1-2

    图三-1-2 展示了 图三-1-1的不等式组转化后的图。

    2、三角不等式

    如果还没有完全理解,我们可以先来看一个简单的情况,如下三个不等式:

    B – A <= c (1)

    C – B <= a (2)

    C – A <= b (3)

    我们想要知道C – A的最大值,通过(1) + (2),可以得到 C – A <= a + c,所以这个问题其实就是求min{b, a+c}。将上面的三个不等式按照 三-1 数形结合 中提到的方式建图,如图三-2-1所示。

    img

    图三-2-1

    我们发现min{b, a+c}正好对应了A到C的最短路,而这三个不等式就是著名的三角不等式。将三个不等式推广到m个,变量推广到n个,就变成了n个点m条边的最短路问题了。

    3、解的存在性

    上文提到最短路的时候,会出现负权圈或者根本就不可达的情况,所以在不等式组转化的图上也有可能出现上述情况,先来看负权圈的情况,如图三-3-1,下图为5个变量5个不等式转化后的图,需要求得是X[t] – X[s]的最大值,可以转化成求s到t的最短路,但是路径中出现负权圈,则表示最短路无限小,即不存在最短路,那么在不等式上的表现即X[t] – X[s] <= T中的T无限小,得出的结论就是 X[t] – X[s]的最大值 不存在。

    img

    图三-3-1

    再来看另一种情况,即从起点s无法到达t的情况,如图三-3-2,表明X[t]和X[s]之间并没有约束关系,这种情况下X[t] – X[s]的最大值是无限大,这就表明了X[t]和X[s]的取值有无限多种。

    img

    图三-3-2

    在实际问题中这两种情况会让你给出不同的输出。综上所述,差分约束系统的解有三种情况:

    1、有解;2、无解;3、无限多解;

    4、最大值 => 最小值

    然后,我们将问题进行一个简单的转化,将原先的”<=”变成”>=”,转化后的不等式如下:

    B – A >= c (1)

    C – B >= a (2)

    C – A >= b (3)

    然后求C – A的最小值,类比之前的方法,需要求的其实是max{b, c+a},

    于是对应的是图三-2-1从A到C的最长路

    同样可以推广到n个变量m个不等式的情况。

    5、不等式标准化

    如果给出的不等式有”<=”也有”>=”,又该如何解决呢?

    很明显,首先需要关注最后的问题是什么,

    如果需要求的是两个变量差的最大值,那么需要将所有不等式转变成”<=”的形式,建图后求最短路

    相反,如果需要求的是两个变量差的最小值,那么需要将所有不等式转化成”>=”,建图后求最长路

    如果有形如:A – B = c 这样的等式呢?我们可以将它转化成以下两个不等式:

    A – B >= c (1)

    A – B <= c (2)

    再通过上面的方法将其中一种不等号反向,建图即可。

    最后,如果这些变量都是整数域上的,那么遇到A – B < c这样的不带等号的不等式,我们需要将它转化成”<=”或者”>=”的形式,即 A – B <= c – 1。

  • 相关阅读:
    今天再次认真整理了浏览器收藏夹
    今天再次认真整理了浏览器收藏夹
    【博客之星】CSDN2013博客之星--分析和预测
    【博客之星】CSDN2013博客之星--分析和预测
    CSDN博客的文章分类和战略规划
    CSDN博客的文章分类和战略规划
    《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入
    《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入
    个人名片与诚信
    个人名片与诚信
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/11626422.html
Copyright © 2020-2023  润新知