1、1,第五章 图论与网络优化,2,5-1 引论,5-2 图论基本概念,5-3 树及其优化问题,5-4 最短路问题,5-5 最大流问题,5-6 中国邮递员问题,3,5-3 树及其优化问题,一、树及其性质,在各种各样的图中,有一类图是十分简单又非常具有应用价值的图,这就是树。,例5.3 已知有六个城市,它们之间要架设电话线,要求任意两个城市均可以互相通话,并且电话线的总长度最短。,4,如果用六个点v1v6代表这六个城市,在任意两个城市之间架设电话线,即在相应的两个点之间连一条边。这样,六个城市的一个电话网就作成一个图。,5,表示任意两个城市之间均可以通话,这个图必须是连通图。并且,这个图必须是无圈的
2、。否则,从圈上任意去掉一条边,剩下的图仍然是六个城市的一个电话网。下图是一个不含圈的连通图,代表了一个电话线网。,6,定义6: 一个无圈的连通图叫做树。,树一般记为T作为树定义还可以有以下几种表述:,(1) T 连通且无圈或回路;,(2) T 无圈且有n1条边(如果有n个结点);,(3) T 连通有n1条边;,(4) T 无回路,但不相邻的两个结点之间联以一边,恰得一个圈;,(5) T 连通,但去掉T 的任意一条边,T 就不连通了;(亦即,在点集合相同的图中,树是含边数最少的连通图。),(6) T 的任意两个结点之间恰有一条初等链,7,下面介绍树的一些重要性质: 【定理5】 p个顶点的树含p1
3、条边。定理5-1 设图G=(V,E)是一个树 p(G) 2,那么图G中至少有两个悬挂点。定理5-2 图G=(V,E)是一个树的充要条件是G不含圈,并且有且仅有p1条边。定理5-3 图G=(V,E)是一个树的充要条件是G是连通图,并且有且仅有 p1 条边。定理5-4 图G是一个树的充分必要条件是任意两个顶点之间有且仅有一条链。,8,从以上定理,不难得出以下结论:,(1)从一个树中任意去掉一条边,那么剩下的图不是连通图,亦即,在点集合相同的图中,树是含边数最少的连通图。,(2)在树中不相邻的两个点之间加上一条边,那么恰好得到一个圈。,9,定义7 设图K=( V , E1 )是图G=(V , E )
4、的一个支撑子图(点相同并保持图的连通性),如果图K=(V , E1) 是一个树,那么称K 是G 的一个支撑树。,例如 , 图5.10 b 是图5.10a 的一个支撑树,二、支撑树,显然,如果图K=(V,E1)是图G=(V,E)的一个支撑树,那么K 的边数是p(G)1,G中不属于支撑树K 的边数是q(G)p(G)+1。,10,【定理6】一个图G有支撑树的充要条件是G是连通图。证明:充分性: 设图G是连通的,若G不含圈,则按照定义,G是一个树,从而G是自身的一个支撑树。若G含圈,则任取G的一个圈,从该圈中任意去掉一条边,得到图G的一支撑子图G1。若G1不含圈,则G1是G的一个支撑树。若G1仍然含圈
5、,则任取G1的一个圈,再从圈中任意去掉一条边,得到图G的一支撑子图G2。依此类推,可以得到图G的一个支撑子图GK,且不含圈,从而GK是一个支撑树。,11,定理6充分性的证明,提供了一个寻找连通图支撑树的方法叫做“破圈法”。即:就是从图中任取一个圈,去掉一条边。再对剩下的图重复以上步骤,直到不含圈时为止,这样就得到一个支撑树。,例4 用破圈法求出下图的一个支撑树。,12,取一个圈(v1 ,v2 ,v3 ,v1 ),在一个圈中去掉边e3 。,在剩下的图中,再取一个圈(v1 ,v2 ,v4 ,v3 ,v1 ),去掉边e4 。,再从圈(v3 ,v4 ,v5 ,v3 )中去掉边e6 。,再从圈(v1 ,
6、v2 ,v5 ,v4 ,v3 ,v1 )中去掉边e7。,这样,剩下的图不含圈,于是得到一个支撑树,如图所示。,13,1最小支撑树,定义8:设图G=(V,E),E中任意一条边eij上都对应有一个数wij,称wij为eij的权重,权重的全体记作W,称为G上的权重集,简称权。图G称为赋权图。记作G=(V,E,W),G的总权重记作w(G),或者w(E)。 今后,我们讨论的都是连通的赋权图。,一个网络图可以有多个支撑树记G 的所有支撑树的集合为:,T Tk | k1,2,L ,三、最小支撑树及其算法,14,设Tk (V, Ek ,Wk)是图G(V,E,W)的一棵支撑树,则边集Ek中所有边的权数之和称为树
7、Tk 的权数,记为:,则称 T * 为图G的一棵最小支撑树。,定义9:图G的支撑树T中,总权最小的树称为最小支撑树,简称最小树,记作T * ,15,最小树,比如,城市间交通线的建造等,可以归结为这一类问题。,再如前面例3,在已知的几个城市之间联结电话线网,要求总长度最短和总建设费用最少,这类问题的解决都可以归结为最小树问题。,16,【定理7】树T*是图G中最小树的充分必要条件是: 对T*外的每一条边eij,有下列不等式成立:,2最小树的求法,根据定理7,可以得出求T*的两种算法:(1)Kruskal算法(1956年,也称避圈法): 每步取未选边中权最小的边且不构成圈,即:避圈留最小。(2)Ro
8、senstiehl算法(1967年,也称破圈法): 每步弃所取圈中权重最大的边,即:破圈弃最大。,其中:ehk是T*中联通vi与vj的唯一链Cij上的任意一条边。,17,(1)避圈法: 从图中任意节点开始寻找与该节点关联的权数最小的边,使之与以选边不构成为圈,直到选够n-1条边为止。,例,最小树,权为13,从网络中任选一点,19,(2)破圈法: 在图中寻找一个圈。若不存在圈,则已经得到最短树或网络不存在最短树; 去掉该圈中权数最大的边; 反复重复 两步,直到最小树。,最小树,权为13,22,v1,v2,v3,v4,v5,1,4,2,3,1,3,5,2,分别用两种方法求最小树,24,5-4 最短
9、路问题,最短路问题是最重要的网络优化问题之一,它不仅可以直接应用于解决生产实际中的许多问题,如管道铺设、线路安排、厂区布局、设备更新等等,而且经常被作为一个基本工具,用于解决其它优化问题。许多优化问题往往可转化为求图上的最短路,这方面的研究工作已取得了十分丰富的成果,迄今为止,求解的算法已不下数十种。,25,如下图所示的单行线交通网,每个弧旁边的数字表示这条单行线的长度。现在有一个人要从v1出发,经过这个交通网到达v6,要寻求总路程最短的线路。,26,从v1到v6的路线是很多的。比如: 从v1 v2 v4 v6;或者从v1 v2 v3 v5 v6等等。不同的路线,经过的总长度是不同的。例如,按
10、照第一个线路,总长度是3+6+3=12单位, 按照第二个路线,总长度是3+1+1+6=11单位。因此,如何选择路线,使得总长度最短,便是本部分要讨论的问题。,27,一、有向图,【定义10】 从点u到v的有向线段称为弧,记作:a=(u, v),其中,u与v分别称为弧a的始点与终点,图中所有弧的集合则记作A。弧(vi, vj)也常记作aij 。,【定义11】 非空点集V及其相应的非空弧集A之二元组称为有向图,记作D=(V, A)。,28,显然,给定一个有向图D,若去除弧上的方向,则对应得到唯一的无向图G。此时的G 称为D的基础图; 反之,一个无向图G,由于可用不同的方式来标上方向,故可伴生多个有向
11、图。无向图中的许多概念与术语(如链与圈等)可沿用于有向图中,但仍有一些不同之处。将有向图与其基础图相对照,有下列对应关系:,29,在D = (V, A)中,点vi的邻点集N (vi) 可分解为两部分,即:,当D为简单图时,,N (vi)、N+(vi)、N-(vi) 常简记为Ni、Ni+、Ni-。,30,给定一个赋权有向图D ( V,A ) ,对每一条弧aijw (vi,vj),相应地有权w (aij )= wij ,又有两点vs、vt V,设 r 是 D 中从vs 到vt 的一条路,路 r的权是r中所有弧的权之和,记为w(r)最短路问题就是求从vs 到vt 的路中一条权最小的路 r*:,二、最
12、短路问题,31,最短路问题按其不同的要求,可分成下列三种类型: 1、求两个定点之间的最短路; 2、求一个定点到其他各点的最短路; 3、求各点对之间的最短路。 不失一般性,总假定图中无环,以及多重弧只是由两条互为反向的弧组成的二重弧。,32,【例4】(渡河问题) 一人携带狼、羊、菜,须从一条小河的此岸渡往对岸。河边仅有一条小船,容量为2。当人不在场时,狼要吃羊、羊要吃菜。问:应怎样渡河,才能使大家安全到达对岸,且小船在河上的来回次数最少。 (船上必须要有人),33,【解】 记M代表人、W代表狼、S代表羊、V代表菜。 以河的此岸为考察基点,则开始状态为MWSV,结束状态为。 共有16种状态:MWS
13、V、MWS、MWV、MSV、WSV、MW、MS、MV、WS、WV、SV、M、W、S、V、。 其中,有6种不允许出现,即:WSV、MW、MV、WS、SV、M。 于是,可能的状态仅有10种。,34,以每个状态作为顶点,构造相应的图(如图5-8所示),其中,边的连接原则为: 若状态甲经一次渡河可变为乙,则连一条边。 从而,渡河问题就归结为求MWSV的最短路。 (船上必须要有人) (算法形式化方面的内容),35,三、有向图最短路算法,1964年,Ford提出了可求解含负权的最短路问题的递推标号法。,设赋权有向图D = (V, A, W),V中含p个点,现要求始点v1至终点vp的最短路Rp*及其路长rp
14、*。假定D中无负回路(其上总权为负数的回路),将原弧集A增广为新弧集,以使V中任意两点间均有互为反向的两条弧,同时权集W增广为新权集。于是,原图D增广为新图 。,36,其中,当i = j时,若设 ,则与实际背景不符,若 0,则出现负回路,故须定义为0。由Bellman最优化原理易知:从v1到vj的最短路长rj*必满足 ,反之亦然。,显见,若某两相邻点之间有多于一条的同向弧,则可弃大留小,简化为一条弧,从而是一个完全的二重赋权有向图,其中,增广的权集,定义为:,例:最短路径引例,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,求从1到8的最短路径,2
15、,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1, w1=0,min c12,c14,c16=min0+2,0+1,0+3=min2,1,3=1其他为X=1,4, w4=1,w1=0,w1=0,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1,4,min c12,c16,c42,c47=min 0+2,0+3,1+10,1+2=min 2,3,11,3=2X=1,2,4, w2=2,w1=0,w4=1,w2=2,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,
16、6,8,2,X=1,2,4,min c16,c23,c25,c47=min 0+3,2+6,2+5,1+2=min 3,8,7,3=3X=1,2,4,6, w6=3,w2=2,w4=1,w1=0,w6=3,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1,2,4,6,min c23,c25,c47,c67=min 2+6,2+5,1+2,3+4=min 8,7,3,7=3X=1,2,4,6,7, w7=3,w2=2,w4=1,w1=0,w6=3,w7=3,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8
17、,2,X=1,2,4,6,7,min c23,c25,c75,c78=min 2+6,2+5,3+3,3+8=min 8,7,6,11=6X=1,2,4,5,6,7, w5=6,w2=2,w4=1,w1=0,w6=3,w7=3,w5=6,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1,2,4,6,7,min c23,c53,c58,c78=min 2+6,6+9,6+4,3+8=min 8,15,10,11=8X=1,2,3,4,5,6,7, w3=8,w2=2,w4=1,w1=0,w6=3,w7=3,w5=6,w3=8,2,3,7,1,8
18、,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1,2,3,4,6,7,min c38,c58,c78=min 8+6,6+4,3+7=min 14,10,11=10X=1,2,3,4,5,6,7,8, w8=10,w2=2,w4=1,w1=0,w6=3,w7=3,w5=6,w3=8,w8=10,2,3,7,1,8,4,5,6,6,1,3,4,10,5,2,7,5,9,3,4,6,8,2,X=1,2,3,4,6,7,8,1到10的最短路径为1,4,7,5,8,长度为10。,w2=2,w4=1,w1=0,w6=3,w7=3,w5=6,w3=8,w8=10,46,基
19、本思路 : 首先设任一点vi到任一点vj都有一条弧,如果在图G中,(vi ,vj)A,则添加弧(vi ,vj) ,并令wij=+。 显然,从v1到vj的最短路是从v1出发,沿着这条路到某个点vi ,再沿弧(vi ,vj)到vj 。则v1到vi的这条路必然也是v1到vi的最短路。否则,从v1到vj的这条路将不是最短的。于是,设rj表示从v1到vj的最短路长,ri表示从v1到vi的最短路长,则有下列方程:,47,利用如下的递推公式:,开始时,令,即用v1到vj的直接距离做初始解。,从第二步起,使用递推公式:,求,当进行到第t 步,若出现 :,则停止计算。,即为v1到各点的最短路长。,48,计算步骤
20、:,Step 1. 初始标号,Step 2. 第k+1次标号,Step 3. 当成立,时,即得,从vp出发,反向追踪,确定最短路Rp*。 若Rp*中vj已确定,按式 确定前一点vi;,否则,k: = k + 1,转Step 2。最后得到的标号就是v1到各点vi(i = 1, 2, , p)的最短路长。,49,因已知图中顶点为p个,故算法至多经(p 2) + 1 = p 1 次迭代必收敛。若一旦出现 : 则说明D中必含负回路。在负回路上每循环一次,路长减少一个定值,永无休止,最终导致:,【例5】 求图5-9中从v1到v8的最短路。,50,解:利用上面的递推公式,将计算结果列出,如下表所示(空格为
21、+ ) :,0,-1,-2,3,0,-5,-2,-7,1,-1,5,0,-5,-2,-7,-3,-1,-5,-2,0,-5,-2,-7,-3,-1,-5,-10,0,-5,-2,-7,-3,-1,-5,-10,51,可以看出,当t =4时,有:,因此,表中的最后一列,就是从v1到v2 ,.,v8的最短路权。,从v8出发,反向追踪,确定最短路R8*。,上述计算过程,不仅求得了两个定点之间的最短路,而且同时得到一个定点至其他各点的最短路。至于求各点对之间的最短路,则可重复应用上述计算法来解决。,完整的计算表如下所示(表中没有数字的空格表示+)。,于是得一条最短路R8* = v1, v3, v4,
22、v7, v8,路长为r8* = -10。,52,四、无向图最短路算法,设非负赋权简单图G = (V, E, W),V中含p个点,求始点v1至终点vp的最短路及其路长。,这里,介绍一种固定标号法(Dijkstra法)。 其要点是对点vi (i1)用两种标号: 先用临时标号ti (是v1到vi最短路长的某个上界), 再用固定标号ri (是v1到vi的最短路长)。 作一次迭代,就将至少一个ti点变为ri点(又称“将未着色点着色”)。 至多经p 1次迭代,vp变为rp*点,于是得到v1至vp的最短路长, 再反向追踪,定出最短路。 计算过程中,以Vt表示ti点集,Vt中元素将由多变少,直至成为空集。,5
23、3,Dijkstra算法的计算步骤如下:,Step 1. 始点v1作固定标号r1* = 0,其余点vj作临时标号tj = ,Vt = v2, v3, , vp。,Step 2. 设当前已得到一个或多个vi的固定标号ri*,对vjN(vi)Vt,修改vj的临时标号为:,其中,右端的tj是原值,左端的tj是修改值。,Step 3. 对vjVt,取:,为对应点vj*的固定标号,Vt: = Vt -vj*。,Step 4. 当Vt =时,得rp*,再从vp出发,反向追踪,确定最短路Rp*。若Rp*中vj已确定,按 式,确定前一点vi;否则,转Step 2。,54,Dijkstra算法示例:求v1到v6
24、的最短路,+,+,+,+,+,(1)首先给v1以r标号,r(v1)0,给其余所有点T标号,T(vj)( j = 2,3, 6),(0),r标号以( )形式标在结点旁边,T标号以不带()的数字标在结点旁边 .,实际上,所有点最后得到的固定标号正是v1到各点的最短路路长。 用于有向图时,只要取vjN+(vi)Vt即可。,55,r(v2 )= 3,(3),5,r(v3 )= 4,(4),9,(2)考察 v1: T(v2)=min T(v2),r(v1) +a12min ,03 = 3T(v3)=min T(v3),r (v1) +a13min ,05 = 5所以,r (v2 )= 3,(3)考察 v
25、2:T(v3)=min T(v3),r( v2) +a23min 5,31 = 4T(v4)=min T(v4),r(v2) +a24min ,36 = 9所以,r(v3)=4,T(v3 )= 5,T(v4)= 9,56,r(v5)= 5,(5),T(v4)= 8,(4)考察 v3: T(v5)=min T(v5),r(v3) +a35min ,41 = 5T(v4)=min T(v4),r(v3) +a34min 9,44 = 8所以,r(v5)= 5,(5)考察 v5:T(v6)=min T(v6),r(v5) +a56min ,56 = 11T(v4)=min T(v4),r(v5) +
26、a54min 8,52 = 7所以,r(v4)= 7,8,T(v6)= 11,11,(7),r(v4)= 7,57,(6)考察 v4:T(v6)=min T(v6),r(v4) +a46min 11,73 = 10所以,r(v6)= 10所有点都标上r标号,r(v6)= 10,(10),58,(7) 标出最短路 v1到v6的最短路可从v1开始,根据永久性标号数值回溯得到 最短路径是:v1v2v3v5v4v6 ,路长10 同时得到至其余各点的最短路,即各点的永久性标号r(vi),注意: 双标号法只适用于所有wij 0的情形,当赋权有向图中存在负权时,则算法失效,(10),59,由以上计算过程可知
27、,每迭代一次,固定标号个数就会增加。作第k + 1次迭代时,在第k次迭代时才取得固定标号的点之各邻点的临时标号重又查视一遍,有的得以保留,而有的可能改进。 最后,在当前所有临时标号中取出最小值,其对应的点就作为新增加的固定标号点。当然,一个最小值可对应多个点,从而,一次迭代有可能同时得到多个固定标号点,总迭代次数不超过p -1。,60,【例7】 求图5-11所示图中从v1至v8的最短路及路长。,61,【解】 计算表如下:,表中空格对应的值为+,固定标号加方括弧,短横线格是同一行固定标号重复书写的简化,于是,得一条最短路R8*: v1, v3, v5, v2, v6, v8, 路长为 r8* = 11。,0,-,8,2,1, ,-,8,-,10,2, ,-,-,-,8,3, ,10, ,-,-,-,-,7,6,12,10, ,7,-,-,-,-,-,10,12, ,-,-,-,-,-,-,9,12, ,-,-,-,-,-,-,-,11,*,*,*,*,*,*,