1、 -68- 第五章 图与网络模型及方法 1 概论 图论起源于 18 世纪。第一篇图论论文是瑞士数学家欧拉于 1736 年发表的“哥尼斯堡的七座桥” 。 1847 年,克希霍夫为了给出电网络方程而引进了“树”的概念。 1857年,凯莱在计数烷22 +nnHC 的同分异构物时,也发现了“树” 。哈密尔顿于 1859 年提出“周游世界”游戏,用图论的术语,就是如何找出一个连通图中的生成圈、近几十年来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和方法已经渗透到物理、化学、通讯科学、建筑学、运筹学,生物遗传学、心理学、经济学、社会学等学科中。 图论中所谓的“图”是指某类具体事
2、物和这些事物之间的联系。如果我们用点表示这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定的联系,就得到了描述这个“图”的几何形象。图论为任何一个包含了一种二元关系的离散系统提供了一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。哥尼斯堡七桥问题就是一个典型的例子。 在哥尼斯堡有七座桥将普莱格尔河中的两个岛及岛与河岸联结起来,问题是要从这四块陆地中的任何一块开始通过每一座桥正好一次,再回到起点。图 1 哥尼斯堡七桥问题 当然可以通过试验去尝试解决这个问题,但该城居民的任何尝试均未成功。欧拉为了解决这个问题,采用了建立数学模型的方法。他将每一块陆地用一个点来代替,将每一座
3、桥用连接相应两点的一条线来代替,从而得到一个有四个“点” ,七条“线”的“图” 。问题成为从任一点出发一笔画出七条线再回到起点。欧拉考察了一般一笔画的结构特点,给出了一笔画的一个判定法则:这个图是连通的,且每个点都与偶数线相关联,将这个判定法则应用于七桥问题,得到了“不可能走通”的结果,不但彻底解决了这个问题,而且开创了图论研究的先河。 图与网络是运筹学( Operations Research)中的一个经典和重要的分支,所研究的问题涉及经济管理、工业工程、交通运输、计算机科学与信息技术、通讯与网络技术等诸多领域。下面将要讨论的最短路问题、最大流问题、最小费用流问题和匹配问题等都是图与网络的基
4、本问题。 我们首先通过一些例子来了解网络优化问题。 例 1 最短路问题( SPP shortest path problem) 一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。 从甲地到乙地的公路网纵横交错,因此有多种行车路线,这名司机应选择哪条线路呢?假设货柜车的运行速度是恒定的,那么这一问题相当于需要找到一条从甲地到乙地的最短路。 例 2 公路连接问题 某一地区有若干个主要城市,现准备修建高速公路把这些城市连接起来,使得从其-69- 中任何一个城市都可以经高速公路直接或间接到达另一个城市。 假定已经知道了任意两个城市之间修建高速公路的成本,那么应如何决定在哪些城市间修建高速公路,
5、使得总成本最小? 例 3 指派问题( assignment problem) 一家公司经理准备安排 N 名员工去完成 N 项任务,每人一项。由于各员工的特点不同,不同的员工去完成同一项任务时所获得的回报是不同的。如何分配工作方案可以使总回报最大? 例 4 中国邮递员问题( CPP chinese postman problem) 一名邮递员负责投递某个街区的邮件。 如何为他 (她) 设计一条最短的投递路线 (从邮局出发,经过投递区内每条街道至少一次,最后返回邮局)?由于这一问题是我国管梅谷教授 1960 年首先提出的,所以国际上称之为中国邮递员问题。 例 5 旅行商问题( TSP travel
6、ing salesman problem) 一名推销员准备前往若干城市推销产品。如何为他(她)设计一条最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地)?这一问题的研究历史十分悠久,通常称之为旅行商问题。 例 6 运输问题( transportation problem) 某种原材料有 M 个产地, 现在需要将原材料从产地运往 N 个使用这些原材料的工厂。假定 M 个产地的产量和 N 家工厂的需要量已知,单位产品从任一产地到任一工厂的运费已知,那么如何安排运输方案可以使总运输成本最低? 上述问题有两个共同的特点: 一是它们的目的都是从若干可能的安排或方案中寻求某种意义下的最优安排
7、或方案,数学上把这种问题称为最优化或优化( optimization)问题;二是它们都易于用图形的形式直观地描述和表达,数学上把这种与图相关的结构称为网络( network) 。与图和网络相关的最优化问题就是网络最优化或称网络优化 ( netwok optimization)问题。所以上面例子中介绍的问题都是网络优化问题。由于多数网络优化问题是以网络上的流( flow)为研究的对象,因此网络优化又常常被称为网络流( network flows)或网络流规划等。 下面首先简要介绍图与网络的一些基本概念。 2 图与网络的基本概念 2.1 无向图 一个无向图 (undirected graph)G
8、是由一个非空有限集合 )(GV 和 )(GV 中某些元素的无序对集合 )(GE 构成的二元组,记为 )(),( GEGVG = 。其中,)(21 nvvvGV L= 称为图 G 的顶点集( vertex set)或节点集( node set) , )(GV 中的每一个元素 ),2,1( niviL= 称为该图的一个顶点( vertex)或节点( node) ;,)(21 meeeGE L= 称为图 G 的边集 ( edge set) , )(GE 中的每一个元素ke (即 )(GV中某两个元素jivv , 的无序对 ) 记为 ),(jikvve = 或ijjikvvvve = ),2,1( m
9、k L= ,被称为该图的一条从iv 到jv 的边( edge) 。 当边jikvve = 时,称jivv , 为边ke 的端点,并称jv 与iv 相邻( adjacent) ;边ke 称为与顶点jivv , 关联( incident) 。如果某两条边至少有一个公共端点,则称这两条边在图 G 中相邻。 边上赋权的无向图称为赋权无向图或无向网络( undirected network) 。我们对图和网络不作严格区分,因为任何图总是可以赋权的。 -70- 一个图称为 有限图 ,如果它的顶点集和边集都有限。图 G 的顶点数用符号 |V 或)(G 表示,边数用 | E 或 )(G 表示。 当讨论的图只有
10、一个时,总是用 G 来表示这个图。从而在图论符号中我们常略去字母 G ,例如,分别用 ,EV 和 代替 )(),(),( GGEGV 和 )(G 。 端点重合为一点的边称为 环 (loop)。 一个图称为 简单图 (simple graph),如果它既没有环也没有两条边连接同一对顶点。 2.2 有向图 定义 一个有向图 ( directed graph 或 digraph) G 是由一个非空有限集合 V 和 V 中某些元素的有序对集合 A构成的二元组,记为 ),( AVG = 。其中 ,21 nvvvV L= 称为图 G 的顶点集或节点集, V 中的每一个元素 ),2,1( niviL= 称为
11、该图的一个顶点或节点; ,21 maaaA L= 称为图 G 的弧集( arc set) , A中的每一个元素ka (即 V 中某两个元素jivv , 的有序对 ) 记为 ),(jikvva = 或 ),2,1( nkvvajikL= ,被称为该图的一条从iv 到jv 的弧( arc) 。 当弧jikvva = 时,称iv 为ka 的尾( tail) ,jv 为ka 的头( head) ,并称弧ka 为iv 的出弧( outgoing arc) ,为jv 的入弧( incoming arc) 。 对应于每个有向图 D,可以在相同顶点集上作一个图 G ,使得对于 D的每条弧,G 有一条有相同端点
12、的边与之相对应。这个图称为 D的基础图。反之,给定任意图 G ,对于它的每个边,给其端点指定一个顺序,从而确定一条弧,由此得到一个有向图,这样的有向图称为 G 的一个定向图。 以下若未指明“有向图”三字, “图”字皆指无向图。 2.3 完全图、二分图 每一对不同的顶点都有一条边相连的简单图称为完全图 (complete graph)。 n个顶点的完全图记为nK 。 若 YXGV U=)( , =YX I , 0| YX (这里 | X 表示集合 X 中的元素个数) , X 中无相邻顶点对, Y 中亦然,则称 G 为二分图 (bipartite graph);特别地,若YyXx , ,则 )(G
13、Exy ,则称 G 为完全二分图,记成|,| YXK 。 2.4 子图 图 H 叫做图 G 的 子图( subgraph) ,记作 GH ,如果 )()( GVHV ,)()( GEHE 。若 H 是 G 的子图,则 G 称为 H 的 母图 。 G 的支撑子图( spanning subgraph,又成生成子图)是指满足 )()( GVHV = 的子图 H 。 2.5 顶点的度 设 )(GVv , G 中与 v关联的边数(每个环算作两条边)称为 v的度 (degree),记作 )(vd 。若 )(vd 是奇数,称 v是奇顶点 (odd point); )(vd 是偶数,称 v是偶顶点 (eve
14、n point)。关于顶点的度,我们有如下结果: (i) =Vvvd 2)( (ii) 任意一个图的奇顶点的个数是偶数。 2.6 图与网络的数据结构 -71- 网络优化研究的是网络上的各种优化模型与算法。 为了在计算机上实现网络优化的算法,首先我们必须有一种方法(即数据结构)在计算机上来描述图与网络。一般来说,算法的好坏与网络的具体表示方法,以及中间结果的操作方案是有关系的。这里我们介绍计算机上用来描述图与网络的 5 种常用表示方法: 邻接矩阵表示法、 关联矩阵表示法、弧表表示法、邻接表表示法和星形表示法。在下面数据结构的讨论中,我们首先假设),( AVG = 是一个简单有向图, mAnV =
15、 |,| , 并假设 V 中的顶点用自然数 n,2,1 L表示或编号, A中的弧用自然数 m,2,1 L 表示或编号。对于有多重边或无向网络的情况,我们只是在讨论完简单有向图的表示方法之后,给出一些说明。 ( i)邻接矩阵表示法 邻接矩阵表示法是将图以邻接矩阵( adjacency matrix)的形式存储在计算机中。图),( AVG = 的邻接矩阵是如下定义的: C 是一个 nn 的 10 矩阵,即 nnnnijcC= 1,0)( , =.),(,0,),(,1AjiAjicij也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为 1;否则为 0。可以看出,这种表示法非常简单、直接。但
16、是,在邻接矩阵的所有2n 个元素中,只有 m个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。 图 2 有向图 例 7 对于图 2 所示的有向图,可以用邻接矩阵表示为 0110010100000100100000110同样,对于网络中的权,也可以用类似邻接矩阵的 nn 矩阵表示。只是此时一条弧所对应的元素不再是 1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。 ( ii)关联矩阵表示法 关联矩阵表示法是将图以关联矩阵( incidence matrix)的形式存储在计算机中图),( AVG = 的关联矩阵 B是如下定义的:
17、 B是一个 mn 的矩阵,即 mnmnikbB= 1,0,1)( , -72- =.,0,),(, ,1,),(,1其它AijkVjAjikVjbik也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。如果一个节点是一条弧的起点,则关联矩阵中对应的元素为 1;如果一个节点是一条弧的终点,则关联矩阵中对应的元素为 1 ;如果一个节点与一条弧不关联,则关联矩阵中对应的元素为 0。对于简单图,关联矩阵每列只含有两个非零元(一个 1+ ,一个 1 ) 。可以看出,这种表示法也非常简单、直接。但是,在关联矩阵的所有 nm 个元素中,只有 m2 个为非零元。如果网络比较稀疏,这种表示法也
18、会浪费大量的存储空间。但由于关联矩阵有许多特别重要的理论性质,因此它在网络优化中是非常重要的概念。 例 8 对于例 7 所示的图,如果关联矩阵中每列对应弧的顺序为 (1,2), (1,3), (2,4),(3,2), (4,3), (4,5), (5,3)和 (5,4),则关联矩阵表示为 1110000010110100010110100000110100000011同样,对于网络中的权,也可以通过对关联矩阵的扩展来表示。例如,如果网络中每条弧有一个权,我们可以把关联矩阵增加一行,把每一条弧所对应的权存储在增加的行中。如果网络中每条弧赋有多个权,我们可以把关联矩阵增加相应的行数,把每一条弧所对
19、应的权存储在增加的行中。 ( iii)弧表表示法 弧表表示法将图以弧表( arc list)的形式存储在计算机中。所谓图的弧表,也就是图的弧集合中的所有有序对。弧表表示法直接列出所有弧的起点和终点,共需 m2 个存储单元,因此当网络比较稀疏时比较方便。此外,对于网络图中每条弧上的权,也要对应地用额外的存储单元表示。例如,例 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,则弧表表示如表 1所示。 表 1 起点 1 1 2 3 4 4 5 5 终点 2 3
20、 4 2 3 5 3 4 权 8 9 6 4 0 3 6 7 为了便于检索,一般按照起点、终点的字典序顺序存储弧表,如上面的弧表就是按照这样的顺序存储的。 ( iv)邻接表表示法 邻接表表示法将图以邻接表( adjacency lists)的形式存储在计算机中。所谓图的邻接表,也就是图的所有节点的邻接表的集合;而对每个节点,它的邻接表就是它的所有出弧。邻接表表示法就是对图的每个节点,用一个单向链表列出从该节点出发的所有弧,链表中每个单元对应于一条出弧。为了记录弧上的权,链表中每个单元除列出弧的另一个端点外,还可以包含弧上的权等作为数据域。图的整个邻接表可以用一个指针数组表示。例如,例 7 所示
21、的图,邻接表表示为 -73- 这是一个 5 维指针数组,每一维(上面表示法中的每一行)对应于一个节点的邻接表,如第 1 行对应于第 1 个节点的邻接表(即第 1 个节点的所有出弧) 。每个指针单元的第 1 个数据域表示弧的另一个端点(弧的头) ,后面的数据域表示对应弧上的权。如第 1 行中的“ 2”表示弧的另一个端点为 2(即弧为( 1,2) ) , “ 8”表示对应弧 (1,2)上的权为 8; “ 3”表示弧的另一个端点为 3(即弧为 (1,3)) , “ 9”表示对应弧( 1, 3)上的权为 9。又如,第 5 行说明节点 5 出发的弧有 (5,3)、 (5,4),他们对应的权分别为 6 和
22、 7。 对于有向图 ),( AVG = ,一般用 )(iA 表示节点 i的邻接表,即节点 i的所有出弧构成的集合或链表(实际上只需要列出弧的另一个端点,即弧的头) 。例如上面例子,3,2)1( =A , 4,3)5( =A 等。 ( v)星形表示法 星形( star)表示法的思想与邻接表表示法的思想有一定的相似之处。对每个节点,它也是记录从该节点出发的所有弧, 但它不是采用单向链表而是采用一个单一的数组表示。也就是说,在该数组中首先存放从节点 1 出发的所有弧,然后接着存放从节点 2出发的所有孤,依此类推,最后存放从节点 n出发的所有孤。对每条弧,要依次存放其起点、终点、权的数值等有关信息。这
23、实际上相当于对所有弧给出了一个顺序和编号,只是从同一节点出发的弧的顺序可以任意排列。此外,为了能够快速检索从每个节点出发的所有弧,我们一般还用一个数组记录每个节点出发的弧的起始地址(即弧的编号) 。在这种表示法中,可以快速检索从每个节点出发的所有弧,这种星形表示法称为前向星形( forward star)表示法。 例如,在例 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。此时该网络图可以用前向星形表示法表示为表 2 和表
24、3 。 表 2 节点对应的出弧的起始地址编号数组 节点号 i 1 2 3 4 5 6 起始地址 )(ipoint 1 3 4 5 7 9 表 3 记录弧信息的数组 弧编号 1 2 3 4 5 6 7 8 起点 1 1 2 3 4 4 5 5 终点 2 3 4 2 3 5 3 4 权 8 9 6 4 0 3 6 7 在数组 point中, 其元素个数比图的节点数多 1(即 1+n ) , 且一定有 1)1( =point ,1)1( +=+ mnpoint 。对于节点 i,其对应的出弧存放在弧信息数组的位置区间为 1)1(),( +ipointipoint , 如果 )1()( += ipoin
25、tipoint ,则节点 i没有出弧。这种表示法与弧表表示法也非常相-74- 似, “记录弧信息的数组”实际上相当于有序存放的“弧表” 。只是在前向星形表示法中,弧被编号后有序存放,并增加一个数组( point)记录每个节点出发的弧的起始编号。 前向星形表示法有利于快速检索每个节点的所有出弧, 但不能快速检索每个节点的所有入弧。为了能够快速检索每个节点的所有入孤,可以采用反向星形( reverse star)表示法: 首先存放进入节点 1 的所有孤, 然后接着存放进入节点 2 的所有弧, 依此类推,最后存放进入节点 n的所有孤。对每条弧,仍然依次存放其起点、终点、权的数值等有关信息。同样,为了
26、能够快速检索从每个节点的所有入弧,我们一般还用一个数组记录每个节点的入孤的起始地址(即弧的编号) 。例如,例 7 所示的图,可以用反向星形表示法表示为表 4 和表 5。 表 4 节点对应的入弧的起始地址编号数组 节点号 i 1 2 3 4 5 6 起始地址 )(irpoint 1 1 3 6 8 9 表 5 记录弧信息的数组 弧编号 1 2 3 4 5 6 7 8 终点 2 2 3 3 3 4 4 5 起点 3 1 1 4 5 5 2 4 权 4 8 9 0 6 7 6 3 如果既希望快速检索每个节点的所有出弧,也希望快速检索每个节点的所有入弧,则可以综合采用前向和反向星形表示法。当然,将孤信
27、息存放两次是没有必要的,可以只用一个数组( trace)记录一条弧在两种表示法中的对应关系即可。例如,可以在采用前向星形表示法的基础上,加上上面介绍的 rpoint 数组和如下的 trace数组即可。这相当于一种紧凑的双向星形表示法,如表 6 所示。 表 6 两种表示法中的弧的对应关系 反向法中弧编号 j 1 2 3 4 5 6 7 8 正向法中弧编号 )( jtrace 4 1 2 5 7 8 3 6 对于网络图的表示法,我们作如下说明: 星形表示法和邻接表表示法在实际算法实现中都是经常采用的。星形表示法的优点是占用的存储空间较少,并且对那些不提供指针类型的语言(如 FORTRAN 语言等)
28、也容易实现。邻接表表示法对那些提供指针类型的语言(如 C 语言等)是方便的,且增加或删除一条弧所需的计算工作量很少, 而这一操作在星形表示法中所需的计算工作量较大(需要花费 )(mO 的计算时间) 。有关“计算时间”的观念是网络优化中需要考虑的一个关键因素。 当网络不是简单图,而是具有平行弧(即多重弧)时,显然此时邻接矩阵表示法是不能采用的。其他方法则可以很方便地推广到可以处理平行弧的情形。 上述方法可以很方便地推广到可以处理无向图的情形,但由于无向图中边没有方向,因此可能需要做一些自然的修改。例如,可以在计算机中只存储邻接矩阵的一半信息(如上三角部分) ,因为此时邻接矩阵是对称矩阵。无向图的
29、关联矩阵只含有元素0 和 1+ ,而不含有 1 ,因为此时不区分边的起点和终点。又如,在邻接表和星形表示法中,每条边会被存储两次,而且反向星形表示显然是没有必要的,等等。 2.7 轨与连通 kkveevevW L2110= ,其中 )(GEei , ki 1 , )(GVvj , kj 0 ,ie 与-75- iivv ,1关联,称 W 是图 G 的一条道路 (walk), k 为路长,顶点0v 和kv 分别称为 W 的起点和终点,而121,kvvv L 称为它的内部顶点。 若道路 W 的边互不相同,则 W 称为迹 (trail)。若道路 W 的顶点互不相同,则 W 称为轨 (path)。 称
30、一条道路是闭的,如果它有正的长且起点和终点相同。起点和终点重合的轨叫做圈 (cycle)。 若图 G 的两个顶点 vu, 间存在道路,则称 u和 v连通 (connected)。 vu, 间的最短轨的长叫做 vu, 间的距离。记作 ),( vud 。若图 G 的任二顶点均连通,则称 G 是连通图。 显然有: (i) 图 P是一条轨的充要条件是 P是连通的,且有两个一度的顶点,其余顶点的度为 2; (ii) 图 C 是一个圈的充要条件是 C 是各顶点的度均为 2 的连通图。 3 应用最短路问题 3.1 两个指定顶点之间的最短路径 问题如下: 给出了一个连接若干个城镇的铁路网络, 在这个网络的两个
31、指定城镇间,找一条最短铁路线。 以各城镇为图 G 的顶点, 两城镇间的直通铁路为图 G 相应两顶点间的边, 得图 G 。对 G 的每一边 e,赋以一个实数 )(ew 直通铁路的长度,称为 e的权,得到赋权图 G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图 G 中指定的两个顶点00,vu间的具最小权的轨。这条轨叫做00,vu 间的最短路,它的权叫做00,vu 间的距离,亦记作 ),(00vud 。 求最短路已有成熟的算法:迪克斯特拉( Dijkstra)算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到 G 的各顶点的最短路和距离,直至0v (或直至 G 的所有顶点) ,算
32、法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令 0)(0=ul ,对0uv ,令 =)(vl , 00uS = , 0=i 。 (ii) 对每个iSv (iiSVS = ) ,用 )()(),(min uvwulvliSu+代替 )(vl 。计算 )(min vliSv,把达到这个最小值的一个顶点记为1+iu ,令11 +=iiiuSS U 。 (iii). 若 1| = Vi ,停止;若 1| a(i,k)+a(k,j) a(i,j)=a(i,k)+a(k,j); path(i,j)=k; end end end end a, path 我们使用 LIN
33、GO9.0编写的 FLOYD算法如下: model: sets: nodes/c1c6/; link(nodes,nodes):w,path; !path标志最短路径上走过的顶点 ; endsets data: path=0; w=0; text(mydata1.txt)=writefor(nodes(i):writefor(nodes(j): format(w(i,j), 10.0f),newline(1); text(mydata1.txt)=write(newline(1); text(mydata1.txt)=writefor(nodes(i):writefor(nodes(j): f
34、ormat(path(i,j), 10.0f),newline(1); enddata calc: w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10; w(2,3)=15;w(2,4)=20;w(2,6)=25; w(3,4)=10;w(3,5)=20; w(4,5)=10;w(4,6)=25;w(5,6)=55; for(link(i,j):w(i,j)=w(i,j)+w(j,i); for(link(i,j) |i#ne#j:w(i,j)=if(w(i,j)#eq#0,10000,w(i,j); for(nodes(k):for(nodes(i):for(no
35、des(j): -81- tm=smin(w(i,j),w(i,k)+w(k,j); path(i,j)=if(w(i,j)#gt# tm,k,path(i,j);w(i,j)=tm); endcalc end 我们编写的求起点 sb 到终点 db 通用的 Floyd 算法程序如下: function dist,mypath=myfloyd(a,sb,db); % 输入: a邻接矩阵 (aij)是指 i 到 j 之间的距离,可以是有向的 % sb起点的标号; db终点的标号 % 输出: dist最短路的距离; % mypath最短路的路径 n=size(a,1); path=zeros(n);
36、 for i=1:n for j=1:n if a(i,j)=inf path(i,j)=j; %j是 i 的后续点 end end end for k=1:n for i=1:n for j=1:n if a(i,j)a(i,k)+a(k,j) a(i,j)=a(i,k)+a(k,j); path(i,j)=path(i,k); end end end end dist=a(sb,db); mypath=sb; t=sb; while t=db temp=path(t,db); mypath=mypath,temp; t=temp; end return 4 树 4.1 基本概念 连通的无圈
37、图叫做树,记之为 T 。若图 G 满足 )()( TVGV = , )()( GETE ,则称 T 是 G 的生成树。图 G 连通的充分必要条件为 G 有生成树。一个连通图的生成树的个数很多,用 )(G 表示 G 的生成树的个数,则有公式 公式 (Caylay)2)(=nnnK 。 公式 )()()( eGeGG += 。 其中 eG 表示从 G 上删除边 e, eG 表示把 e的长度收缩为零得到的图。 树有下面常用的五个充要条件。 定理 1 ( i) G 是树当且仅当 G 中任二顶点之间有且仅有一条轨道。 -82- ( ii) G 是树当且仅当 G 无圈,且 1= 。 ( iii) G 是树
38、当且仅当 G 连通,且 1= 。 ( iv) G 是树当且仅当 G 连通,且 )(GEe , eG 不连通。 ( v) G 是树当且仅当 G 无圈, )(GEe , eG+ 恰有一个圈。 4.2 应用连线问题 欲修筑连接 n个城市的铁路,已知 i城与 j 城之间的铁路造价为ijC ,设计一个线路图,使总造价最低。 连线问题的数学模型是在连通赋权图上求权最小的生成树。 赋权图的具最小权的生成树叫做最小生成树。 下面介绍构造最小生成树的两种常用算法。 4.2.1 prim 算法构造最小生成树 设置两个集合 P 和 Q ,其中 P 用于存放 G 的最小生成树中的顶点,集合 Q存放 G的最小生成树中的
39、边。 令集合 P的初值为 1vP = (假设构造最小生成树时, 从顶点1v出发) ,集合 Q的初值为 =Q 。 prim 算法的思想是,从所有 Pp , PVv 的边中,选取具有最小权值的边 pv,将顶点 v加入集合 P 中,将边 pv加入集合 Q中,如此不断重复,直到 VP = 时,最小生成树构造完毕,这时集合 Q中包含了最小生成树的所有边。 prim 算法如下: ( i) 1vP = , =Q ; ( ii) while VP = 找最小边 pv,其中 PVvPp , vPP += pvQQ += end 图 5 最小生成树问题 例 13 用 prim 算法求图 5 的最小生成树。 我们用
40、nresult3的第一、 二、 三行分别表示生成树边的起点、 终点、 权集合。 Matlab程序如下: clc;clear; a=zeros(7); a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70; -83- a=a+a;a(find(a=0)=inf; result=;p=1;tb=2:length(a); while length(result)=length(a)-1 temp=a(p,tb);temp=temp(:); d
41、=min(temp); jb,kb=find(a(p,tb)=d); j=p(jb(1);k=tb(kb(1); result=result,j;k;d;p=p,k;tb(find(tb=k)=; end result 4.2.1 Kruskal 算法构造最小生成树 科茹斯克尔( Kruskal)算法是一个好算法。 Kruskal 算法如下 : (i)选 )(1GEe ,使得 min)(1=ew 。 (ii)若ieee ,21L 已选好,则从 ,)(21 ieeeGE L 中选取1+ie ,使得 ,121 +iieeeeG L 中无圈,且 min)(1=+iew 。 (iii)直到选得1e 为
42、止。 例 14 用 Kruskal 算法构造例 3 的最小生成树。 我们用nindex2存放各边端点的信息,当选中某一边之后,就将此边对应的顶点序号中较大序号 u改记为此边的另一序号 v,同时把后面边中所有序号为 u的改记为 v。此方法的几何意义是:将序号 u的这个顶点收缩到 v顶点, u顶点不复存在。后面继续寻查时,发现某边的两个顶点序号相同时,认为已被收缩掉,失去了被选取的资格。 Matlab 程序如下: clc;clear; a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)
43、=30; a(4,7)=42; a(5,6)=70; i,j,b=find(a); data=i;j;b;index=data(1:2,:); loop=max(size(a)-1; result=; while length(result)的对集 M ,则 M 称为最大对集;若 G 中有一轨,其边交替地在对集 M 内外出现,则称此轨为 M 的交错轨,交错轨的起止顶点都未被许配时,此交错轨称为可增广轨。 若把可增广轨上在 M 外的边纳入对集,把 M 内的边从对集中删除,则被许配的顶点数增加 2,对集中的“对儿”增加一个。 1957 年,贝尔热 (Berge)得到最大对集的充要条件: 定理 2
44、M 是图 G 中的最大对集当且仅当 G 中无 M 可增广轨。 1935 年,霍尔 (Hall)得到下面的许配定理: 定理 3 G 为二分图, X 与 Y 是顶点集的划分, G 中存在把 X 中顶点皆许配的对集的充要条件是, XS ,则 |)(| SSN ,其中 )(SN 是 S 中顶点的邻集。 由上述定理可以得出: 推论 1: 若 G 是 k 次( )0k 正则 2 分图,则 G 有完美对集。 所谓 k 次正则图,即每顶点皆 k 度的图。 由此推论得出下面的婚配定理: 定理 4 每个姑娘都结识 )1( kk 位小伙子,每个小伙子都结识 k 位姑娘,则每位姑娘都能和她认识的一个小伙子结婚,并且每
45、位小伙子也能和他认识的一个姑娘结婚。 人员分派问题等实际问题可以化成对集来解决。 人员分派问题: 工作人员nxxx ,21L 去做 n件工作nyyy ,21L ,每人适合做其中一件或几件,问能否每人都有一份适合的工作?如果不能,最多几人可以有适合的工作? 这个问题的数学模型是: G 是二分图,顶点集划分为 YXGV U=)( ,,1 nxxX L= , ,1 nyyY L= ,当且仅当ix 适合做工作jy 时, )(GEyxji ,求G 中的最大对集。 解决这个问题可以利用 1965 年埃德门兹 (Edmonds)提出的匈牙利算法。 匈牙利算法: ( i)从 G 中任意取定一个初始对集 M 。
46、 ( ii)若 M 把 X 中的顶点皆许配,停止, M 即完美对集;否则取 X 中未被 M 许配的一顶点 u,记 uS = , =T 。 ( iii)若 TSN =)( ,停止,无完美对集;否则取 TSNy )( 。 ( iv)若 y 是被 M 许配的,设 Myz , zSS U= , yTT U= ,转( iii) ;否则,取可增广轨 ),( yuP ,令 )()( MPEPEMM = U ,转( ii) 。 把以上算法稍加修改就能够用来求二分图的最大完美对集。 最优 分派问题: 在人员分派问题中,工作人员适合做的各项工作当中,效益未必一致,我们需要制定一个分派方案,使公司总效益最大。 这个
47、问题的数学模型是:在人员分派问题的模型中,图 G 的每边加了权0)( jiyxw ,表示ix 干jy 工作的效益,求加权图 G 上的权最大的完美对集。 解决这个问题可以用库恩曼克莱斯( Kuhn-Munkres)算法。为此,我们要引入可行顶点标号与相等子图的概念。 -85- 定义 若映射 RGVl )(: ,满足 YyXx , , )()()( xywylxl + , 则称 l 是二分图 G 的可行顶点标号。令 )()()(),(| xywylxlGExyxyEl=+= , 称以lE 为边集的 G 的生成子图为相等子图,记作lG 。 可行顶点标号是存在的。例如 ;),(max)( Xxxywx
48、lYy=Yyyl = ,0)( 。 定理 5 lG 的 完美对集即为 G 的权最大的完美对集。 Kuhn-Munkres 算法 ( i)选定初始可行顶点标号 l ,确定lG ,在lG 中选取一个对集 M 。 ( ii)若 X 中顶点皆被 M 许配,停止, M 即 G 的权最大的完美对集;否则,取lG中未被 M 许配的顶点 u,令 uS = , =T 。 (iii)若 TSNlG)( ,转( iv) ;若 TSNlG=)( ,取 )()()(min,xywylxlTySxl+= , +=其它),(,)(,)()(vlTvvlSvvlvlll, ll = ,llGG = 。 ( iv) 选 TSNlG)( 中一顶点 y, 若 y 已被 M 许配, 且 Myz , 则 zSS U= ,yTT U= ,转( iii) ;否则,取lG 中一个 M 可增广轨 ),( yuP ,令 )()( MPEPEMM = U , 转( ii) 。 其中 )(SNlG是lG 中 S 的相邻顶点集。 6 Euler 图和 Hamilton 图