差分约束系统.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
差分约束系统 引例 国王 很久以前,在某个国家,王子出生了 但是,王子有一点弱智…… 老国王去世后,王子登基了 但是,大臣们不买王子的账,要弹劾他…… 皇后向ACM班的你求助——只有你才能救他! 救救孩子啊~~~ 引例 国王 引例 国王 引例 国王 原问题转化为一个关于 的不等式组有没有整数解的问题 差分约束系统 差分约束系统: 若一个系统由n个变量和m个约束条件组成,且每个约束条件有如下形式,则称为一个有n个变量和m个约束条件的差分约束系统。 差分约束系统 矩阵形式 约束图 约束图 约束图 约束图 结论 若图中有负权回路,即 ,则系统无可行解 否则,有可行解,解为 引理 三角形不等式 G = (V, E)是加权有向图,任取一点s,则对于所有(u,v)∈E,有如下不等式成立: 证明:反证法 对结论的证明(1) 1。不存在负权回路 考虑约束条件 有 对结论的证明(2) 2。存在负权回路,不妨设为c 差分约束系统 如何求最短路呢? Dijkstra Bellman-Ford … Bellman-Ford for each v ?V do d[v] ? ?; d[s] ? 0 Relaxation for i =1,...,|V|-1 do for each edge (u,v) ? E do d[v] ? min{d[v], d[u]+w(u,v)} Negative cycle checking for each v ?V do if d[v] d[u] + w(u,v) then no solution Bellman-Ford 时间复杂度: O(VE) 正确性证明: 引理: d[v] ? ?(s,v) 数学归纳法 迭代前显然正确 若迭代时有 d[v] = d[u] +w(u,v)成立,则称一次成功松弛,按照成功松弛的次数进行归纳 ?(s,v) ? ?(s,u)+w(u,v) ? d[u]+w(u,v) =d[v] Bellman-Ford 如果没有从s可以到达的负权回路,那么在 |V|-1迭代后对于所有的d[v]有: d[v]=?(s,v) s ? v[1] ? v[2] ? ... ? v 第i次迭代后d[v[i]]= ?(s,v[i])且不变(引理) 如果存在从s可达的负权回路,则一定会有某个(u,v), d[v]d[u]+ω(u,v) 国王 稍微修改一下 的定义: 国王 构约束图,利用Bellman-Ford求解 若存在可行解,则数列元素由下式给出: 区间(SWERC2002) 给你n个边界是整数的闭区间 和n个整数 所有数在[1,m]内 请你找到一个整数集合Z,使得 1。|Z|最小 2。 区间(SWERC2002) 定义: 区间(SWERC2002) 差分约束系统在实际中的应用 练习(NOI99 01串) 给定7个整数N,A0,B0,L0,A1,B1,L1,要求设计一个01串S=s1s2…si…sN,满足: si=0或si=1,1=i=N; 对于S的任何连续的长度为L0的子串sjsj+1…sj+L0-1(1=j=N-L0+1),0的个数大于等于A0且小于等于B0; 对于S的任何连续的长度为L1的子串sjsj+1…sj+L1-1(1=j=N-L1+1),1的个数大于等于A1且小于等于B1; 例如,N=6,A0=1,B0=2,L0=3,A1=1,B1=1,L1=2,则存在一个满足上述所有条件的01串S=010101。 附源码: #includestdio.h #includealgorithm using namespace std; #define MAX 60000 #define MAXINT 1000000 struct EDGE{ ?int st,ed,val; }edge[MAX]; int dis[MAX],n,min,max; int bellman_ford() { ?int i,k; ?for(i=min;i=max;i++) ??dis[i]=-MAXINT; ?dis[min]=0; ?bool over; ?for(k=0;k=max-min;k++) ?{ ??over=true; ??for(i=0;in;i++) ???if(dis[edge[i].st]!=-MAXINTdis[edge[i].st]+edge[i].valdis[edge[i].ed]) ???{ ????dis[edge[i].ed]=dis[edge[i].st]+edge[i].val; ????over

文档评论(0)

20010520 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档