《差分约束系统》详解

本文转自:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html

  一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问你是否满足有解的问题!

  神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面开始详细介绍下:

  (1)比如给出三个不等式,b-a<=k1,c-b<=k2,c-a<=k3,若要求出c-a的最大值,我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权,如图

  由题我们可以得知,这个有向图中,由题b-a<=k1,c-b<=k2,得出c-a<=k1+k2,因此比较k1+k2和k3的大小,求出最小的就是c-a的最大值了。

  根据以上的解法,我们可能会猜到求解过程实际就是求从a到c的最短路径,没错的....简单的说就是从a到c沿着某条路径后把所有权值和k求出就是c -a<=k的一个推广的不等式约束,既然这样,满足题目的肯定是最小的k,也就是从a到c最短距离...

  理解了这里之后,想做题还是比较有困难的,因为题目需要变形一下,不能单纯的算..

  (1)首先以poj3159为例,这个比较简单,就是给出两个点的最大差,然后让你求1到n的最大差,直接建图后用bellman或者spfa就可以过了。

  (2)稍微难点的就是poj1364,因为他给出的不等式不是x-y<=k形式,有时候是大于号,这样需要我们去变形一下,并且给出的还是>,<没有等于,都要变形

  (3)再有就是poj1201,他要求出的是最长距离,那就要把形式变换成x-y>=k的标准形式

(变形)注意点:

  1. 如果要求最大值想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意 x-y<k  => x-y<=k-1。

  2. 如果要求最小值的话,变为x-y>=k的标准形式,然后建立一条从y到x的k边,求出最长路径即可。

  3. 如果权值为正,用dj,spfa,bellman都可以,如果为负不能用dj,并且需要判断是否有负环,有的话就不存在。

时间: 2025-01-31 00:34:19

《差分约束系统》详解的相关文章

jsp c:forEach 详解

<c:forEach 详解 <c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1 var 代表当前项目的变量名 否 无 varStatus 显示循环状态的变量 否 无 vaStatus 属性 JSTL中的varStatus和 var 属性一样, varStatus 用于创建限定了作用域的变量.不过,由 varStatu

forEach 详解

<c:forEach>标签的语法定义如下所示 <c:forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach> <c:forEach&g

&lt;c:forEach&gt;详解

<c:forEach>标签的语法定义如下所示. <c:forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach> <c:forEach&

c:foreach 详解

本文转自:http://www.blogjava.net/caizh2009/articles/278999.html 在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JSTL的迭代标签可以在很大的程度上简化迭代操作. JSTL所支持的迭代标签有两个,分别是<c:forEach>和<c:forTokens>.在这里介绍的是<c:fo

详解JSTL的forEach标签

详解JSTL的forEach标签 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍. ? ? ?<c:forEach> 标签的语法?说明?: 语法:迭代一集合对象之所有成员 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"

MyBatis的foreach语句详解

MyBatis的foreach语句详解 MyBatis的foreach语句详解 1人收藏此文章, 我要收藏 发表于3个月前 , 已有113次阅读 共0个评论 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,se

PHP中foreach循环详解

首先要说的是,其实我对foreach循环的用法并不是很精通,说详解,其实也只是我自己的理解,希望对你能有点帮助 . 先来看一下foreach的语法: foreach ($array as $key=>$value) { …… } 为了便于理解,我们假定这里的$array是一个一维的相关数组,$key是数组的索引,$value是这个索引的值,它们的名字可以随意,之所以叫$key和$value是为了便于理解.为了能让你更好的理解foreach的工作过程,我们来创建一个数组: $array = arr

C# foreach 实用方法详解

网上查资料,说foreach 不能修改迭代变量,只能访问迭代变量.自己理解也不是很深,通过几个代码进行验证,发现foreach的用法还有点特别 验证方法: 1. 迭代变量 为int int[] argint = { 12,12,12,12,12}; foreach (int item in argint) { item = 100; } 结果:编译不通过,提示item为迭代变量,无法为它赋值: 2. 迭代变量为struct public struct MyStruct { public stri

MyBatis的Mapper文件的foreach标签详解

MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据.如:使用foreach来拼接in子语句. 在学习MyBatis Mapper文件的foreach标签时我们先看看DTD是如何定义的?DTD代码如下: 1 2 3 4 5 6 7 8 9 10 <!-- 定义foreach元素 --> <!ELEMENT foreach (#PCDATA | include | trim | where | set | fo

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数