码迷,mamicode.com
首页 > 其他好文 > 详细

【差分约束】

时间:2017-11-09 19:42:36      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:开始   格式   size   block   bsp   ott   .com   nbsp   最短路   

这里有一大堆不等式或者等式形成的限制条件,题目通常会问问你是否存在合法方案或者让你求出合法方案。——————————差分约束

·前言:

      一个概括的定义是,一些不等式组可以视作一个差分约束系统。简单而言,就是给出许多不等式,然后我们需要给每个未知数填上值,使它们满足所有给出的关于它们的不等式——这正是这类问题的求解过程。由于这一过程类似于最短路算法中的松弛操作,因此解决差分约束问题成了最短路算法的一个美妙而重要用途。

 

·一个例题

       这里呢有一个长度为n的序列,现在给出m条信息,每条信息是一个三元组{l,r,w}表示这个序列的区间[l,r]之内的元素之和为w。现在需要我们判断是否存在满足条件的序列(Yes or No)。

        先想想怎么样的信息可以使得没有满足条件的序列?很容易,只需要产生一个矛盾就可以了: ( {1,3,10} {4,5,20} {1,5,29} )。

      既然给出的信息都是区间和,那么我们可以使用前缀S[i]来做以下事情:
      这里为了满足上述三个约束条件,我们可以写出这三个式子:

         S[i]表示[1,i]的元素和,S[0]=0

      ①S[0]+10=S[3]    ②S[3]+20=S[5]     ③S[0]+29=S[5]

              至此,只是按照题目输入的信息得到了几个迷迷糊糊的等式,怎么快速判断一般情况的矛盾依旧很吃力。

 

·从不等式到最短路

   为什么说是"不等式"而不是"等式"?仅仅是为了统一化——任何等式可以表示为两个不等式(a+b=c --> a+b<=c&&a+b>=c),因此让我们从更加一般化的不等式开始入手吧。

      这样一来,我们需要寻求一种方式,高效判断不等式组 ai+wi<=bi (这里统一了不等式的格式)。一个笨笨的想法是,我们先去保证部分不等式满足条件,再去使得其他不等式满足,最终使得所有的不等式满足。这显得很笼统而天真,举一个例子来说明这个笨笨地想法具体怎样操作:

                    技术分享

       考虑错综复杂的不等关系:假如此时b1已经有一个值了,但是a1发现b1比自己加上w1的值要小……怎么办?因此a1决定将b1修改到刚刚好的位置,即此时赋值: b1=a1+w1。刚刚好?是的。据此,我们发现,只要一个ai发现某个bi的值不符合它的要求,它就会把这个bi强制修改为刚刚满足条件的值。这一步操作我们写成代码就长这样:

                 技术分享

             这个图片足以让我们将其与最短路算法的松弛操作相联系。从这个图来看,如果要转化为最短路,那么必须要建一张图(额其实这里是最长路,不过呢这两者本质没区别)。根据图中信息可以发现,a到b建了一条权值为w[i]的边。

     

    (还没完呐!!!)

     

【差分约束】

标签:开始   格式   size   block   bsp   ott   .com   nbsp   最短路   

原文地址:http://www.cnblogs.com/Paul-Guderian/p/7810780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!