图论及其算法.docx
《图论及其算法.docx》由会员分享,可在线阅读,更多相关《图论及其算法.docx(39页珍藏版)》请在冰豆网上搜索。
![图论及其算法.docx](https://file1.bdocx.com/fileroot1/2022-12/16/d71041c6-1f2c-4d87-bb40-dc00fe2d2375/d71041c6-1f2c-4d87-bb40-dc00fe2d23751.gif)
图论及其算法
-44-
第五章图与网络模型及方法
§1概论
图论起源于18世纪。
第一篇图论论文是瑞士数学家欧拉于1736年发表的“哥尼
斯堡的七座桥”。
1847年,克希霍夫为了给出电网络方程而引进了“树”的概念。
1857
年,凯莱在计数烷n2n+2CH的同分异构物时,也发现了“树”。
哈密尔顿于1859年提
出“周游世界”游戏,用图论的术语,就是如何找出一个连通图中的生成圈,近几十年
来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和
方法已经渗透到物理、化学、通讯科学、建筑学、生物遗传学、心理学、经济学、社会
学等学科中。
图论中所谓的“图”是指某类具体事物和这些事物之间的联系。
如果我们用点表示
这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定的联系,就得到
了描述这个“图”的几何形象。
图论为任何一个包含了一种二元关系的离散系统提供了
一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。
哥尼斯堡七桥问
题就是一个典型的例子。
在哥尼斯堡有七座桥将普莱格尔河中的两个岛及岛与河岸联结
起来问题是要从这四块陆地中的任何一块开始通过每一座桥正好一次,再回到起点。
当
然可以通过试验去尝试解决这个问题,但该城居民的任何尝试均未成功。
欧拉为了解决
这个问题,采用了建立数学模型的方法。
他将每一块陆地用一个点来代替,将每一座桥
用连接相应两点的一条线来代替,从而得到一个有四个“点”,七条“线”的“图”。
问
题成为从任一点出发一笔画出七条线再回到起点。
欧拉考察了一般一笔画的结构特点,
给出了一笔画的一个判定法则:
这个图是连通的,且每个点都与偶数线相关联,将这个
判定法则应用于七桥问题,得到了“不可能走通”的结果,不但彻底解决了这个问题,
而且开创了图论研究的先河。
图与网络是运筹学(OperationsResearch)中的一个经典和重要的分支,所研究的
问题涉及经济管理、工业工程、交通运输、计算机科学与信息技术、通讯与网络技术等
诸多领域。
下面将要讨论的最短路问题、最大流问题、最小费用流问题和匹配问题等都
是图与网络的基本问题。
我们首先通过一些例子来了解网络优化问题。
例1最短路问题(SPP-shortestpathproblem)
一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。
从甲地到乙地的
公路网纵横交错,因此有多种行车路线,这名司机应选择哪条线路呢?
假设货柜车的运
行速度是恒定的,那么这一问题相当于需要找到一条从甲地到乙地的最短路。
例2公路连接问题
某一地区有若干个主要城市,现准备修建高速公路把这些城市连接起来,使得从其
中任何一个城市都可以经高速公路直接或间接到达另一个城市。
假定已经知道了任意两
-45-
个城市之间修建高速公路的成本,那么应如何决定在哪些城市间修建高速公路,使得总
成本最小?
例3指派问题(assignmentproblem)
一家公司经理准备安排N名员工去完成N项任务,每人一项。
由于各员工的特点
不同,不同的员工去完成同一项任务时所获得的回报是不同的。
如何分配工作方案可以
使总回报最大?
例4中国邮递员问题(CPP-chinesepostmanproblem)
一名邮递员负责投递某个街区的邮件。
如何为他(她)设计一条最短的投递路线(从
邮局出发,经过投递区内每条街道至少一次,最后返回邮局)?
由于这一问题是我国管
梅谷教授1960年首先提出的,所以国际上称之为中国邮递员问题。
例5旅行商问题(TSP-travelingsalesmanproblem)
一名推销员准备前往若干城市推销产品。
如何为他(她)设计一条最短的旅行路线
(从驻地出发,经过每个城市恰好一次,最后返回驻地)?
这一问题的研究历史十分悠
久,通常称之为旅行商问题。
例6运输问题(transportationproblem)
某种原材料有M个产地,现在需要将原材料从产地运往N个使用这些原材料的工
厂。
假定M个产地的产量和N家工厂的需要量已知,单位产品从任一产地到任一工厂
的运费已知,那么如何安排运输方案可以使总运输成本最低?
上述问题有两个共同的特点:
一是它们的目的都是从若干可能的安排或方案中寻求
某种意义下的最优安排或方案,数学上把这种问题称为最优化或优化(optimization)
问题;二是它们都易于用图形的形式直观地描述和表达,数学上把这种与图相关的结构
称为网络(network)。
与图和网络相关的最优化问题就是网络最优化或称网络优化
(netwokoptimization)问题。
所以上面例子中介绍的问题都是网络优化问题。
由于多
数网络优化问题是以网络上的流(flow)为研究的对象,因此网络优化又常常被称为网
络流(networkflows)或网络流规划等。
下面首先简要介绍图与网络的一些基本概念。
§2图与网络的基本概念
2.1无向图
一个无向图(undirectedgraph)G是由一个非空有限集合V(G)和V(G)中某些元素
的无序对集合E(G)构成的二元组,记为G=(V(G),E(G))。
其中
(){,,,}12nVG=vvv称为图G的顶点集(vertexset)或节点集(nodeset),V(G)中
的每一个元素v(i1,2,,n)i=称为该图的一个顶点(vertex)或节点(node);
(){,,,}12mEG=eee称为图G的边集(edgeset),E(G)中的每一个元素ke(即V(G)
中某两个元素ijv,v的无序对)记为(,)kije=vv或kijjie=vv=vv(k=1,2,,m),
被称为该图的一条从iv到jv的边(edge)。
当边kije=vv时,称ijv,v为边ke的端点,并称jv与iv相邻(adjacent);边ke称
为与顶点ijv,v关联(incident)。
如果某两条边至少有一个公共端点,则称这两条边在
图G中相邻。
边上赋权的无向图称为赋权无向图或无向网络(undirectednetwork)。
我们对图和
网络不作严格区分,因为任何图总是可以赋权的。
一个图称为有限图,如果它的顶点集和边集都有限。
图G的顶点数用符号|V|或
-46-
n(G)表示,边数用|E|或e(G)表示。
当讨论的图只有一个时,总是用G来表示这个图。
从而在图论符号中我们常略去
字母G,例如,分别用V,E,n和e代替V(G),E(G),n(G)和e(G)。
端点重合为一点的边称为环(loop)。
一个图称为简单图(simplegraph),如果它既没有环也没有两条边连接同一对顶点。
2.2有向图
定义一个有向图(directedgraph或digraph)G是由一个非空有限集合V和V中
某些元素的有序对集合A构成的二元组,记为G=(V,A)。
其中{,,,}12nV=vvv称
为图G的顶点集或节点集,V中的每一个元素v(i1,2,,n)i=称为该图的一个顶点
或节点;{,,,}12mA=aaa称为图G的弧集(arcset),A中的每一个元素ka(即V中
某两个元素ijv,v的有序对)记为(,)kija=vv或avv(k1,2,,n)k=ij=,被称为该图
的一条从iv到jv的弧(arc)。
当弧kija=vv时,称iv为ka的尾(tail),jv为ka的头(head),并称弧ka为iv的
出弧(outgoingarc),为jv的入弧(incomingarc)。
对应于每个有向图D,可以在相同顶点集上作一个图G,使得对于D的每条弧,
G有一条有相同端点的边与之相对应。
这个图称为D的基础图。
反之,给定任意图G,
对于它的每个边,给其端点指定一个顺序,从而确定一条弧,由此得到一个有向图,这
样的有向图称为G的一个定向图。
以下若未指明“有向图”三字,“图”字皆指无向图。
2.3完全图、二分图
每一对不同的顶点都有一条边相连的简单图称为完全图(completegraph)。
n个顶点
的完全图记为nK。
若V(G)=XY,XY=Φ,|X||Y|≠0(这里|X|表示集合X中的元素个
数),X中无相邻顶点对,Y中亦然,则称G为二分图(bipartitegraph);特别地,若
∀x∈X,∀y∈Y,则xy∈E(G),则称G为完全二分图,记成|X|,|Y|K。
2.4子图
图H叫做图G的子图(subgraph),记作H⊂G,如果V(H)⊂V(G),
E(H)⊂E(G)。
若H是G的子图,则G称为H的母图。
G的支撑子图(spanningsubgraph,又成生成子图)是指满足V(H)=V(G)的子
图H。
2.5顶点的度
设v∈V(G),G中与v关联的边数(每个环算作两条边)称为v的度(degree),记
作d(v)。
若d(v)是奇数,称v是奇顶点(oddpoint);d(v)是偶数,称v是偶顶点(even
point)。
关于顶点的度,我们有如下结果:
(i)∑
∈
=
vV
d(v)2e
(ii)任意一个图的奇顶点的个数是偶数。
2.6图与网络的数据结构
网络优化研究的是网络上的各种优化模型与算法.为了在计算机上实现网络优化的
-47-
算法,首先我们必须有一种方法(即数据结构)在计算机上来描述图与网络。
一般来说,
算法的好坏与网络的具体表示方法,以及中间结果的操作方案是有关系的。
这里我们介
绍计算机上用来描述图与网络的5种常用表示方法:
邻接矩阵表示法、关联矩阵表示法、
弧表表示法、邻接表表示法和星形表示法。
在下面数据结构的讨论中,我们首先假设
G=(V,A)是一个简单有向图,|V|=n,|A|=m,并假设V中的顶点用自然数1,2,,n
表示或编号,A中的弧用自然数1,2,,m表示或编号。
对于有多重边或无向网络的情
况,我们只是在讨论完简单有向图的表示方法之后,给出一些说明。
(i)邻接矩阵表示法
邻接矩阵表示法是将图以邻接矩阵(adjacencymatrix)的形式存储在计算机中。
图
G=(V,A)的邻接矩阵是如下定义的:
C是一个n⨯n的0-1矩阵,即
nn
ijnnCc⨯
⨯=()∈{0,1},
⎩⎨⎧
∉
∈
=
0,(,).
1,(,),
ijA
ijA
cij
也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;否则为0。
可以看出,这种表示法非常简单、直接。
但是,在邻接矩阵的所有n2个元素中,只有m
个为非零元。
如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络
中查找弧的时间。
例7对于右图所示的图,可以用邻接矩阵表示为
⎥⎥⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢⎢⎢
⎣
⎡
00110
00101
01000
00010
01100
同样,对于网络中的权,也可以用类似邻接矩阵的n⨯n矩阵表示。
只是此时一条
弧所对应的元素不再是1,而是相应__________的权而已。
如果网络中每条弧赋有多种权,则可以
用多个矩阵表示这些权。
(ii)关联矩阵表示法
关联矩阵表示法是将图以关联矩阵(incidencematrix)的形式存储在计算机中.图
G=(V,A)的关联矩阵B是如下定义的:
B是一个n⨯m的矩阵,即
nm
iknmBb⨯
⨯=()∈{-1,0,1},
⎪⎩
⎪⎨
⎧
-∃∈=∈
∃∈=∈
=
0,.
1,,(,),
1,,(,),
其它
jVkjiA
jVkijA
bik
也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。
如
果一个节点是一条弧的起点,则关联矩阵中对应的元素为1;如果一个节点是一条弧的
终点,则关联矩阵中对应的元素为-1;如果一个节点与一条弧不关联,则关联矩阵中
对应的元素为0。
对于简单图,关联矩阵每列只含有两个非零元(一个+1,一个-1)。
可以看出,这种表示法也非常简单、直接。
但是,在关联矩阵的所有nm个元素中,只
有2m个为非零元。
如果网络比较稀疏,这种表示法也会浪费大量的存储空间。
但由于
-48-
关联矩阵有许多特别重要的理论性质,因此它在网络优化中是非常重要的概念。
例8对于例7所示的图,如果关联矩阵中每列对应弧的顺序为(1,2),(1,3),(2,4),
(3,2),(4,3),(4,5),(5,3)和(5,4),则关联矩阵表示为
⎥⎥⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢⎢⎢
⎣
⎡
-
--
---
--
00000111
00101101
01011010
10110000
11000000
同样,对于网络中的权,也可以通过对关联矩阵的扩展来表示。
例如,如果网络中
每条弧有一个权,我们可以把关联矩阵增加一行,把每一条弧所对应的权存储在增加的
行中。
如果网络中每条弧赋有多个权,我们可以把关联矩阵增加相应的行数,把每一条
弧所对应的权存储在增加的行中。
(iii)弧表示法
弧表表示法将图以弧表(arclist)的形式存储在计算机中。
所谓图的弧表,也就是
图的弧集合中的所有有序对。
弧表表示法直接列出所有弧的起点和终点,共需2m个存
储单元,因此当网络比较稀疏时比较方便。
此外,对于网络图中每条弧上的权,也要对
应地用额外的存储单元表示。
例如,例7所示的图,假设弧(1,2),(1,3),(2,4),(3,2),
(4,3),(4,5),(5,3)和(5,4)上的权分别为8,9,6,4,0,3,6和7,则弧表表示如下:
起点11234455
终点23423534
权89640367
为了便于检索,一般按照起点、终点的字典序顺序存储弧表,如上面的弧表就是按
照这样的顺序存储的。
(iv)邻接表表示法
邻接表表示法将图以邻接表(adjacencylists)的形式存储在计算机中。
所谓图的
邻接表,也就是图的所有节点的邻接表的集合;而对每个节点,它的邻接表就是它的所
有出弧。
邻接表表示法就是对图的每个节点,用一个单向链表列出从该节点出发的所有
弧,链表中每个单元对应于一条出弧。
为了记录弧上的权,链表中每个单元除列出弧的
另一个端点外,还可以包含弧上的权等作为数据域。
图的整个邻接表可以用一个指针数
组表示。
例如,例7所示的图,邻接表表示为
这是一个5维指针数组,每一维(上面表示法中的每一行)对应于一个节点的邻接
表,如第1行对应于第1个节点的邻接表(即第1个节点的所有出弧)。
每个指针单元
的第1个数据域表示弧的另一个端点(弧的头),后面的数据域表示对应弧上的权。
如
第1行中的“2”表示弧的另一个端点为2(即弧为(1,2)),“8”表示对应弧(1,2)上的
-49-
权为8;“3”表示弧的另一个端点为3(即弧为(1,3)),“9”表示对应弧(1,3)上的权
为9。
又如,第5行说明节点5出发的弧有(5,3)、(5,4),他们对应的权分别为6和7。
对于有向图G=(V,A),一般用A(i)表示节点i的邻接表,即节点i的所有出弧构
成的集合或链表(实际上只需要列出弧的另一个端点,即弧的头)。
例如上面例子,
A
(1)={2,3},A(5)={3,4}等。
这种记法我们在本书后面将会经常用到。
(v)星形表示法
星形(star)表示法的思想与邻接表表示法的思想有一定的相__________似之处。
对每个节点,
它也是记录从该节点出发的所有弧,但它不是采用单向链表而是采用一个单一的数组表
示。
也就是说,在该数组中首先存放从节点1出发的所有弧,然后接着存放从节点2
出发的所有孤,依此类推,最后存放从节点n出发的所有孤。
对每条弧,要依次存放其
起点、终点、权的数值等有关信息。
这实际上相当于对所有弧给出了一个顺序和编号,
只是从同一节点出发的弧的顺序可以任意排列。
此外,为了能够快速检索从每个节点出
发的所有弧,我们一般还用一个数组记录每个节点出发的弧的起始地址(即弧的编号)。
在这种表示法中,可以快速检索从每个节点出发的所有弧,这种星形表示法称为前向星
形(forwardstar)表示法。
例如,在例7所示的图中,仍然假设弧(1,2),(l,3),(2,4),(3,2),(4,3),(4,5),
(5,3)和(5,4)上的权分别为8,9,6,4,0,3,6和7。
此时该网络图可以用前向
星形表示法表示如下:
节点对应的出弧的起始地址编号数组(记为point)
节点号i123456
起始地址point(i)134679
记录弧信息的数组
弧编号12345678
起点11234455
终点23423534
权89640367
在数组point中,其元素个数比图的节点数多1(即n+1),且一定有point
(1)=1,
point(n+1)=m+1。
对于节点i,其对应的出弧存放在弧信息数组的位置区间为
[point(i),point(i+1)-1],
如果point(i)=point(i+1),则节点i没有出弧。
这种表示法与弧表表示法也非常相
似,“记录弧信息的数组”实际上相当于有序存放的“弧表”。
只是在前向星形表示法中,
弧被编号后有序存放,并增加一个数组(point)记录每个节点出发的弧的起始编号。
前向星形表示法有利于快速检索每个节点的所有出弧,但不能快速检索每个节点的
所有入弧。
为了能够快速检索每个节点的所有入孤,可以采用反向星形(reversestar)
__________表示法:
首先存放进入节点1的所有孤,然后接着存放进入节点2的所有弧,依此类推,
最后存放进入节点n的所有孤。
对每条弧,仍然依次存放其起点、终点、权的数值等有
关信息。
同样,为了能够快速检索从每个节点的所有入弧,我们一般还用一个数组记录
每个节点的入孤的起始地址(即弧的编号)。
例如,例7所示的图,可以用反向星形表
示法表示为如下形式:
节点对应的入弧的起始地址编号数组(记为rpoint)
节点号i123456
-50-
起始地址rpoint(i)113689
记录弧信息的数组
弧编号12345678
终点22333445
起点31145524
权48906763
如果既希望快速检索每个节点的所有出弧,也希望快速检索每个节点的所有入弧,
则可以综合采用前向和反向星形表示法。
当然,将孤信息存放两次是没有必要的,可以
只用一个数组(trace)记录一条弧在两种表示法中的对应关系即可。
例如,可以在采用
前向星形表示法的基础上,加上上面介绍的rpoint数组和如下的trace数组即可。
这相
当于一种紧凑的双向星形表示法如下所示:
两种表示法中的弧的对应关系(记为trace)
反向法中弧编号j12345678
正向法中弧编号trace(j)41257836
对于网络图的表示法,我们作如下说明:
①星形表示法和邻接表表示法在实际算法实现中都是经常采用的。
星形表示法的
优点是占用的存储空间较少,并且对那些不提供指针类型的语言(如FORTRAN语言
等)也容易实现。
邻接表表示法对那些提供指针类型的语言(如C语言等)是方便的,
且增加或删除一条弧所需的计算工作量很少,而这一操作在星形表示法中所需的计算工
作量较大(需要花费O(m)的计算时间)。
有关“计算时间”的观念是网络优化中需要
考虑的一个关键因素。
②当网络不是简单图,而是具有平行弧(即多重弧)时,显然此时邻接矩阵表示
法是不能采用__________的。
其他方法则可以很方便地推广到可以处理平行弧的情形。
③上述方法可以很方便地推广到可以处理无向图的情形,但由于无向图中边没有
方向,因此可能需要做一些自然的修改。
例如,可以在计算机中只存储邻接矩阵的一半
信息(如上三角部分),因为此时邻接矩阵是对称矩阵。
无向图的关联矩阵只含有元素
0和+1,而不含有-1,因为此时不区分边的起点和终点。
又如,在邻接表和星形表示
法中,每条边会被存储两次,而且反向星形表示显然是没有必要的,等等。
2.7轨与连通
kkWv0e1v1e2ev=,其中eE(G)i∈,1≤i≤k,vV(G)j∈,0≤j≤k,ie与
iiv,v-1关联,称W是图G的一条道路(walk),k为路长,顶点0v和kv分别称为W的起
点和终点,而121,,,k-vvv称为它的内部顶点。
若道路W的边互不相同,则W称为迹(trail)。
若道路W的顶点互不相同,则W称
为轨(path)。
称一条道路是闭的,如果它有正的长且起点和终点相同。
起点和终点重合的轨叫做
圈(cycle)。
若图G的两个顶点u,v间存在道路,则称u和v连通(connected)。
u,v间的最短轨
的长叫做u,v间的距离。
记作d(u,v)。
若图G的任二顶点均连通,则称G是连通图。
显然有:
-51-
(i)图P是一条轨的充要条件是P是连通的,且有两个一度的顶点,其余顶点的度
为2;
(ii)图C是一个圈的充要条件是C是各顶点的度均为2的连通图。
§3应用—最短路问题
3.1两个指定顶点之间的最短路径
问题如下:
给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,
找一条最短铁路线。
以各城镇为图G的顶点,两城镇间的直通铁路为图G相应两顶点间的边,得图G。
对G的每一边e,赋以一个实数w(e)—直通铁路的长度,称为e的权,得到赋权图G。
G的子图的权是指子图的各边的权和。
问题就是求赋权图G中指定的两个顶点00u,v
间的具最小权的轨。
这条轨叫做00u,v间的最短路,它的权叫做00u,v间的距离,亦记
作(,)00duv。
求最短路已有成熟的算法:
迪克斯特拉(Dijkstra)算法,其基本思想是按距0u从
近到远为顺序,依次求得0u到G的各顶点的最短路和距离,直至0v(或直至G的所有
顶点),算法结束。
为避免重复并保留每一步的计算信息,采用了标号算法。
下面是该
算法。
(i)令()