- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法 定理: 如果约束图没有负圈, 则可取xu为起点v0到u的最短路长; 若约束图有负圈, 差分约束系统无解. 正确性证明 无负圈: 由松弛条件可证明每个约束得到满足 有负圈: 把负圈上的约束条件叠加将得到一个矛盾不等式 算法步骤 构图, 得到n+1个结点m+n条边 运行bellman-ford, 时间 O(n2+mn) 练习 如何修改bellman-ford算法, 使得将它应用在差分约束系统的求解中, 使得当m比n小时, 时间复杂度可以由O(n2+mn)降为O(mn) 如果差分约束中存在等式约束, 即xi-xj=bk, 如何求解? xi=bk 或者-xi=bk呢? 如果限定xi=0, 证明bellman-ford算法得到的可行解让xi总和最大化 证明bellman-ford算法得到的可行解让max{xi}-min{xi}最小 修改算法使得当b取实数时可以得到整数解. 如果给定变量子集需要取整数呢? 应用——出纳员的雇佣 24小时营业的超市需要一批出纳员来满足它的需求, 每天的不同时段需要不同数目的出纳员 给出每小时需要出纳员的最少数R0, …, R23 R(0)表示从午夜到午夜1:00需要出纳员的最少数目, R(1)表示上午1:00到2:00之间需要的… 每一天,这些数据都是相同的 有N人申请这项工作, 如果第i个申请者被录用,他将从ti刻开始连续工作8小时 计算为满足上述限制需要雇佣的最少出纳员数目 i时刻可以有比对应的Ri更多的出纳员在工作 分析 前i小时的雇佣总数:s[i] (规定s[-1] = 0) 第i小时需要的出纳员:r[i] 第i小时申请的人数:t[i] 取(i,j)满足i = (j+8) mod 24, 则有不等式 0 = s[i] – s[i-1] = t[i] s[23] – s[-1] = sum i j时 s[i] – s[j] = r[i] I j时 s[i] – s[j] = r[i] – sum 当sum固定时, 此不等式组是差分约束系统 可以枚举sum, 也可以二分 五、Gabow的变尺度算法 变尺度算法 变尺度算法(scaling algorithm)广泛的应用在图论算法设计中, 其基本思想是先只考虑某相关输入值的最高位, 然后考虑前两位、前三位、…直到考虑完所有位, 则得到正确结果 考虑SSSP问题. 令k表示需要考虑的位数.一般取k=log2(W+1)(取上整), wi(u, v)表示边权w(u, v)的前i位. (当k=5, w(i,j)=(11001)2时w3(i,j)=(110)2 让di[v]表示取wi为权函数时的最短路, 则di可以通过di-1用O(E)的时间算出,因此总时间复杂度为O(ElogW) Gabow算法 引理: 若恒有d[v] =|E|, 则d可以在O(E)时间算出.证明: 用dijkstra, 计数排序, 则所有操作都是O(1) Gabow算法 首先用O(E)时间算出d1 由于wi(u,v)等于2wi-1(u,v)或者2wi-1(u,v)+1, 因此 对于任意点v, 2di-1[v]=d[v]=2di-1[v]+|V|-1 对w重加权, wi’(u,v)=wi(u,v)+2di-1[u]-2di-1[v] 则w’(u,v)非负, 且di[v]=di’[v]+2di-1[v], 且di’[v]=|E| 因此可以在O(E)时间通过di-1计算di 总时间复杂度为O(ElogW) 六、每对结点最短路(APSP) APSP基本想法 考虑从每个点出发做一次SSSP的时间效率 权任意时n次bellman-ford是O(n2m), 稠密图时O(n4) 思路: 动态规划 基本动态规划算法 d[i,u,v]为u到v最多不超过i条边的最短路长 算法一: d[i,u,v]=min{d[i-1,u,x]+w(x,v)},x遍历v的邻居 时间复杂度:O(V2E) k短路:d[i,u,v]=sum{d[i-1,u,x]+w(x,v)} 算法二: d[i,u,v]为u到v最多不超过2i条边的最短路长, 则最短路可以在O(n3logn)算出 矩阵乘法算法 可以通过矩阵乘法计算任两点间最短路 基本思想和改进 矩阵乘法算法思想:不停加边(算法如下, O(n3)) 优化 时间: 二分计算幂. O(n3logn). 空间用滚动矩阵O(n2) 用Strassen矩阵乘法: O(nlog7logn) 练习 如何求出有向加权图中边数最少的负圈? 七、Floyd-warshall算法 状态设计 设d[i,j,k]是 在只允许经过结点1…k的情况下 i到j的最短路长度 则它有两种情况(想一想,为什么): 最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1] 最短路不经过点k,d[i,j
文档评论(0)