标签:开始 格式 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