版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2/28/2025第七章
图论算法王宏志计算机科学与工程系
2/28/20257.1
最短路径问题7.2
网络流问题7.3
匹配问题提要
2/28/2025
7.1最短路径问题
2/28/2025单源最短路径问题:给定一个有权的有向图G,找到从给定源结点v到另一个结点v的最短路径。
2/28/2025最短路径的性质优化子结构:最短路径包含最短子路径证明:如果某条子路径不是最短子路径必然存在最短子路径用最短子路径替换当前子路径当前路径不是最短路径,矛盾!
2/28/2025最短路径的性质
(u,v)是从u到v最短路径的权重最短路径满足
三角不等式:(u,v)(u,x)+(x,v)“证明”:xuv这条路径不会比另外两条之和长
2/28/2025最短路径的性质如果图中包含负圈,某些最短路径可能不存在
(Why?):<0
2/28/2025松弛最短路径算法的核心技术是松弛Relax(u,v,w){if(d[v]>d[u]+w)thend[v]=d[u]+w;}952752Relax652652Relax
2/28/2025Bellman-Ford算法BellmanFord()foreachvVd[v]=;d[s]=0;fori=1to|V|-1foreachedge(u,v)ERelax(u,v,w(u,v));foreachedge(u,v)Eif(d[v]>d[u]+w(u,v))return“nosolution”;Relax(u,v,w):if(d[v]>d[u]+w)thend[v]=d[u]+w时间复杂性?
2/28/2025Bellman-Ford算法BellmanFord()foreachvVd[v]=;d[s]=0;fori=1to|V|-1foreachedge(u,v)ERelax(u,v,w(u,v));foreachedge(u,v)Eif(d[v]>d[u]+w(u,v))return“nosolution”;Relax(u,v,w):if(d[v]>d[u]+w)thend[v]=d[u]+w初始化d
松弛:
进行|V|-1轮,松弛每条边检验结果
何时得到解?
2/28/2025Bellman-FordAlgorithmBellmanFord()foreachvVd[v]=;d[s]=0;fori=1to|V|-1foreachedge(u,v)ERelax(u,v,w(u,v));foreachedge(u,v)Eif(d[v]>d[u]+w(u,v))return“nosolution”;Relax(u,v,w):if(d[v]>d[u]+w)thend[v]=d[u]+w运行时间是多少?A:O(VE)
2/28/2025Bellman-FordAlgorithmBellmanFord()foreachvVd[v]=;d[s]=0;fori=1to|V|-1foreachedge(u,v)ERelax(u,v,w(u,v));foreachedge(u,v)Eif(d[v]>d[u]+w(u,v))return“nosolution”;Relax(u,v,w):if(d[v]>d[u]+w)thend[v]=d[u]+wBEDCA-1221-3534s
2/28/2025Bellman-Ford注意到处理边的顺序影响到收敛速度正确性:证明|V|-1轮之后d[v]=(s,v)引理:d[v](s,v)总成立起始显然令v是满足d[v]<(s,v)的第一个点令u使得d[v]发生变化:
d[v]=d[u]+w(u,v)那么d[v] <(s,v)
(s,v)(s,u)+w(u,v) (Why?)
(s,u)+w(u,v)d[u]+w(u,v) (Why?)因此d[v]<d[u]+w(u,v).矛盾.
2/28/2025Bellman-Ford证明:|V|-1轮之后,所有d
的值正确考虑从s到v的最短路径:
sv1v2v3v4v开始,d[s]=0正确,不发生变化(Why?)1轮之后,d[v1]正确(Why?)不发生变化2轮之后,d[v2]正确不发生变化…|V|-1轮之后停下:(Why?)
2/28/2025DAG中最短路径Problem:寻找DAG中最短路径Bellman-Ford时间是O(VE).能否做的好一点呢?Idea:使用拓扑排序如果沿着最短路径作,则可以一遍完成DAG中的每条路径都是拓扑排序得到结点序列的一个子序列,那么,如果按照这个顺序处理,我们将沿着路径进行处理因此,扫描一次就够了.时间复杂性是多少?
2/28/2025Dijkstra算法如果没有负边,我们可以超越类似BFS从队列中取结点类似Prim算法使用以d[v]为键的优先队列
2/28/2025Dijkstra’sAlgorithmDijkstra(G)foreachvVd[v]=;d[s]=0;S=;Q=V;while(Q)u=ExtractMin(Q);S=SU{u};foreachvu->Adj[]if(d[v]>d[u]+w(u,v))d[v]=d[u]+w(u,v);松弛步骤Note:调用了
Q->DecreaseKey()BCDA1043215
2/28/2025Dijkstra算法Dijkstra(G)foreachvVd[v]=;d[s]=0;S=;Q=V;while(Q)u=ExtractMin(Q);S=SU{u};foreachvu->Adj[]if(d[v]>d[u]+w(u,v))d[v]=d[u]+w(u,v);正确性:我们必须证明,当u从Q中取出时,它已经收敛了
2/28/2025Dijkstra算法的正确性d[v](s,v)v令u是第一个选出的结点s.t.存在比d[u]更短的路径 d[u]>(s,u)令y是su真实最短路径上的第一个V-S的结点d[y]=(s,y)d[u] >(s,u)
=(s,y)+(y,u)(Why?)
=d[y]+(y,u)
d[y] 但是如果d[u]>d[y],则不会选择u.矛盾sxyup2p2
2/28/2025任意两点最短路径Problem:
找到图中每一对结点间最短路径
图可能包含负边但是不包含负圈
表示:权矩阵
2/28/2025图和权矩阵v1v2v3v4v53224131935
2/28/2025子问题如何定义更小的问题?一种方法是将路径限制在仅包含一个有限集合中的结点
开始这个集合是空的
这个集合可以一直增长到包含所有结点。
2/28/2025子问题令
D(k)[i,j]=从vi
到vj仅包含{v1,v2,…,vk}的路径。D(0)=WD(n)=D
目标矩阵如何从D(k-1)计算D(k)?
2/28/2025递归定义因为
D(k)[i,j]=D(k-1)[i,j]or
D(k)[i,j]=D(k-1)[i,k]+D(k-1)[k,j].
我们得到
D(k)[i,j]=min{D(k-1)[i,j],D(k-1)[i,k]+D(k-1)[k,j]}.ViVjVk仅包含{V1,...Vk-1}的最短路径仅包含{V1,...Vk
}的最短路径
2/28/2025Floyd算法1.D0
W//初始化D
2.P
0//初始化P
3.fork1ton
4.dofori1ton
5.doforj1ton
6.
if(Dk-1[i,j]>Dk-1
[i,k]+Dk-1
[k,j])
7. thenDk[i,j]Dk-1
[i,k]+Dk-1
[k,j]
7. P[i,j]
k;
9. elseDk[i,j]Dk-1
[i,j]
2/28/2025例子W=D0=40520
-30123123000000000123123P=1235-324
2/28/2025
D1=405207
-30123123000001000123123P=1235-324D1[2,3]=min(D0[2,3],D0[2,1]+D0[1,3]) =min(,7) =7D1[3,2]=min(D0[3,2],D0[3,1]+D0[1,2]) =min(-3,) =-340520
-30123123D0=
2/28/2025
D2=405207-1-30123123000001200123123P=D2[1,3]=min(D1[1,3],D1[1,2]+D1[2,3]) =min(5,4+7) =5D2[3,1]=min(D1[3,1],D1[3,2]+D1[2,1]) =min(,-3+2) =-11235-324
D1=405207
-30123123
2/28/2025
D3=205207-1-30123123300001200123123P=D3[1,2]=min(D2[1,2],D2[1,3]+D2[3,2]) =min(4,5+(-3)) =23[2,1]=min(D2[2,1],D2[2,3]+D2[3,1]) =min(2,7+(-1)) =2
D2=405207-1-301231231235-324
2/28/2025Floyd算法:使用两个D矩阵Floyd
1.D
W
2.P
0
3.fork1ton
//ComputingD’fromD
4.dofori1ton
5.doforj1ton
6.
if(D[i,j]>D[i,k]+D[k,j])
7. thenD’[i,j]D[i,k]+D[k,j]
7. P[i,j]
k;
9. elseD’[i,j]D[i,j]
10. MoveD’toD.
2/28/2025Floyd算法:使用1个DFloyd
1.D
W
2.P
0
3.fork1ton
4.dofori1ton
5.doforj1ton
6.
if(D[i,j]>D[i,k]+D[k,j])
7. thenD[i,j]D[i,k]+D[k,j]
7. P[i,j]
k;
2/28/2025打印出从p到r的路径path(indexq,r) if(P[q,r]!=0) path(q,P[q,r])
println(“v”+P[q,r]) path(P[q,r],r)
return; //nointermediatenodes
else
return300001200123123P=1235-324
2/28/2025
7.2网络流问题
2/28/2025网络有向图G=(V,E)
满足每个有向边e
有一个非负容量ce有一个源结点s
没有入边有一个目标点t(target)没有出边20ts10uv201030u,v–中间结点
2/28/2025流G=(V,E)
中的s-t流是一个从E
到R+的函数f满足容量条件:
对每个e,0
f(e)
ce保存条件:
对每个中间结点v,∑einv
f(e)=
∑eoutv
f(e)源和汇满足:∑eint
f(e)=
∑eouts
f(e)20ts10uv20103020ts10uv201010流:网络:
2/28/2025相关定义给定图G=(V,E)中s-t流f
和任意结点集合Sfin(S)=∑einS
f(e)fout(S)=∑eoutS
f(e)性质:fin(t)=fout(s)例子:fin(u,v)=fout(u,v)=3020ts10uv20103020ts10uv201010流:网络:
2/28/2025问题对于给定的图G=(V,E),最大的fin(t)是多少?如何高效地计算?假设:
容量都是正数.例:fin(t)=fout(s)=3020ts10uv20103020ts10uv201010流:网络:
2/28/202538余图给定图G.中的流f余图Gf
同样的结点,中间结点和s,t对于每条边e
满足ce>f(e)
赋给权重ce-f(e)(剩余容量)对于每条边e=(u,v)
给其逆向边(v,u)赋给权重f(e)(剩余容量)20ts10uv20103020ts0uv20020流:20ts10v10余图:u1020网络:
2/28/2025增广路径和增广给定图G中的流f,及其对应的余图Gf
找到余图中的一条新流,该流通过一条没有重复结点的路径并且值和该路径上的最小容量相等(增广路径)沿着路径更新余图20ts10uv201030新的流:20ts10v2010新的余图:u201020ts10v20101010u20网络:
2/28/2025Ford-Fulkerson算法对于所有e初始化f(e)=0While余图中存在s-t路径
P沿着路径P增广
f
得到新的f
和新的余图沿着P增广
f
:找到路径的最小容量沿着路径修改权重20ts10uv201030新流:20ts10v2010新余图:u201020ts10v20101010u20网络:
2/28/2025分析正确性:最大流–一会证明可终止行–每次流是一个整数且最少增加1(假定整数容量)时间:O(mC)最多C
轮iterations,其中
C
是最大流的值
m
是边数每一轮O(m+n)
步–使用DFS查找路径P20ts10uv201030新的流:20ts10v2010新的余图:u201020ts10v20101010u20网络:
2/28/2025流vs.割(A,B)–图G的割:A,B
是结点的划分,s
在A中,t
在B中c(A,B)
=∑eoutA
c(e)=∑einB
c(e)是这个割的
容量性质:最小割等于最大流例:c(A,B)
=5020ts10uv20103020ts10uv201030AB
2/28/2025最大流vs.最小割对于任意包含s的集合A
我们执行如下三个步骤:value(f)
=∑vinA∑eoutv
f(e)-∑vinA∑einv
f(e)value(f)
=fout(A)-fin(A)c(A,B)
fout(A)-fin(A)=value(f)
结论:Min-cut
value(f)例:
c(A,B)
=50and
fout(A)=3020ts10uv20103020ts10/10uv2010/1030/10AB
2/28/2025FF算法可以求得最大流设FF-算法在流f上停止:从s出发的DFS不包含t这意味着在余图中DFS经过的结点和其余结点之间割的容量是0因此这个割中的每条边都被增广流逆转过,这意味着c(DFS,DFS’)=value(f)
根据Min-cut
value(f)可得到
f
最大20ts10uv20103020ts10v2010余图:u2010DFSMin-cut
2/28/2025
7.3匹配问题
2/28/20257.3.1问题与应用
2/28/2025匹配边集合
MÍE满足不存在结点是多于一条边的顶点极大匹配不存在e
ÏE满足MÈ{e}也是匹配最大匹配|M|最大的匹配完美匹配|M|=n/2:每个结点都是M中边的顶点
2/28/2025有权版本每条边有一个代价,寻找具有最小代价的匹配多项式时间可解,但是较难
2/28/2025相关问题给定一个图G,寻找极大匹配:easy(贪心法)最大匹配多项式时间;noteasy.较容易的情况:二分图完美匹配最大匹配的特例关于正则二分图的定理和Schrijver算法
2/28/2025应用人员指派教室指派任务安排赛程安排
2/28/20257.3.2二分图匹配
2/28/2025二分图匹配:使用最大流算法在二分图中寻找最大匹配:建模为流问题并求解:确定算法找到基本流st容量1
2/28/2025同样的技术对变体有效二分图上最小代价完美匹配建模成最小代价流问题二分图中的b-匹配函数b:V®
N.寻找边集合M,其中每个顶点v在M中恰有b(v)条边
2/28/20257.2.3Edmonds算法:无向图中的匹配
2/28/2025M-增广路径M-增广路径:不匹配变化为在流的增广阶段
2/28/2025如下定理对于非二分图也成立定理.令M是图G中的一个匹配,M是最大匹配当且仅当其中没有M-增广路径如果有M-增广路径,M不是最大匹配假设M不是最大匹配,令N是更大的匹配,考虑N*M=NÈM–NÇ
M.N*M中每个结点的度是0,1,2:这是路径和圈的集合.每个圈中的边交替地在M和N中N*M中必然有一条路径在N中的边比M中多:有一条增广路径
2/28/2025Edmonds算法在多项式时间寻找图的最大匹配
2/28/2025JackEdmonds
2/28/2025JackEdmonds
2/28/2025M-blossom定义M-交替迹:(可能非简单的)路径,其边交替在M和非M中M-花M-交替迹,其起点是一个未匹配结点,终点是:
2/28/2025寻找M-增广路径或M-花–I令X
为未匹配结点的集合.令Y
为到X中的结点没有边在M中的结点集合建立有向图D=(V,A)其中A={(u,v)|存在x
满足{u,x}ÎE-M且{x,v}ÎM}.寻找X中的点到Y中的点长度至少为1的最短路径P.(在D中BFS.)构造P’:P之后加上X中的一条边.P’是在两个未匹配结点间的M增广路径
2/28/2025寻找M-增广路径或M-花––II两种情况:P’是简单路径:它就是M增广路径P’不是简单路径.寻找P’的起点直到某个结点被访问了两次这是一个M-花:迹的圈部分不可能有偶数的结点,否则可以将其删除以得到一个D中更短的迹
2/28/2025算法的idea从某个匹配M开始,寻找M增广路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 侦查系推理试题题库及答案
- 手提式双层袋行业深度研究报告
- 数显式电动机保护器行业深度研究报告
- 杀寄生虫药行业深度研究报告
- 色基染料行业深度研究报告
- 高氧酸盐行业深度研究报告
- 数据中心基础设施建设方案
- 地下排水管网建设施工方案
- 公休期间安全协议书
- 银行签订按揭合同范本
- 2025年人保专业笔试真题及答案
- 视频监控作业实施计划方案
- 10.1 国家利益高于一切(教学课件) 2025-2026学年统编版道德与法治八年级上册
- 2025年全国临床医学检验技术中级职称考试真题及答案解析
- 2025年宝鸡市陈仓区社区专职招聘人员(50人)考试模拟试题及答案解析
- 银行公私联动课件
- 制作小火车课件
- 神经符号推理系统-洞察与解读
- 南农《土壤学》课件
- 车库进出口坡道施工方案
- 分子生物学文献阅读汇报
评论
0/150
提交评论