4. 图与网络模型及方法
图论起源于18 世纪。第一篇图论论文是瑞士数学家欧拉于1736 年发表的“哥尼斯堡的七座桥”。1847 年,克希霍夫为了给出电网络方程而引进了“树”的概念。1857年,凯莱在计数烷 的同分异构物时,也发现了“树”。哈密尔顿于 1859 年提出“周游世界”游戏,用图论的术语,就是如何找出一个连通图中的生成圈、近几十年来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和方法已经渗透到物理、化学、通讯科学、建筑学、运筹学,生物遗传学、心理学、经济学、社会学等学科中。
图论为任何一个包含了一种二元关系的离散系统提供了一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。哥尼斯堡七桥问题就是一个典型的例子。在哥尼斯堡有七座桥将普莱格尔河中的两个岛及岛与河岸联结起来,问题是要从这四块陆地中的任何一块开始通过每一座桥正好一次,再回到起点。图1 哥尼斯堡七桥问题当然可以通过试验去尝试解决这个问题,但该城居民的任何尝试均未成功。欧拉为了解决这个问题,采用了建立数学模型的方法。他将每一块陆地用一个点来代替,将每一座桥用连接相应两点的一条线来代替,从而得到一个有四个“点”,七条“线”的“图”。问题成为从任一点出发一笔画出七条线再回到起点。欧拉考察了一般一笔画的结构特点,给出了一笔画的一个判定法则:这个图是连通的,且每个点都与偶数线相关联,将这个判定法则应用于七桥问题,得到了“不可能走通”的结果,不但彻底解决了这个问题,而且开创了图论研究的先河。
4.1 图的基本概念与数据结构
4.1.1 基本概念
直观第讲,对于平面上的n个点,把其中一些点对用曲线或者直线连接起来,不考虑点的位置与连线曲直长短,这样形成的一个关系结构就是一个图。记成 , 是以上述点为元素的顶点集, 是以上述连线为元素的边集。
各条边都加上方向的图称为有向图,否则称为无向图。如果有的边有方向,有的边无方向,则称为混合图。任两顶点间最多有一条边,且每条边的两个端点皆不重合的图,称为简单图。如果图的两顶点之间有边相连,则称此两顶点相邻,每一对顶点都相邻的图称为完全图,否则称为非完全图。完全图记为 。
若 , (这里 表示顶点集 中元素的个数),且 中无相邻的顶点对, 中亦然,则称图 为二分图;特别地,若对任意 , 与 中每个顶点相邻,则称图 为完全二分图,记为 。
设 是边 的端点,则称 与 关联,与顶点 关联的边数称为该顶点的度,记为 ,度为奇数的顶点称为奇顶点,度为偶数的顶点称为偶顶点。可以证明 ,即所有顶点的度数之和为边数的2倍,且由此可以知道奇顶点的总数是偶数。
设 ,其中 , 与 和 关联,称 是图 的一条道路, 为路长, 为起点, 为终点;各边相异的道路称为迹;各顶点相异的道路称为轨道。若 是一轨道,则可记为 ;起点与终点重合的道路称为回路。起点与终点重合的轨道称为圈,即对轨道 ,当 时称为一圈;图中任两顶点之间都存在道路的图,称为连通图。图中含有所有顶点的轨道称为Hamilton轨,闭合的Hamilton轨道称为Hamilton圈;含有Hamilton圈的图称为Hamilton图。
称两定点 分别为起点和终点的最短轨道之长为顶点 的距离;在完全二分图 中, 中两顶点之间的距离为偶数, 中的顶点与 中的顶点的距离为奇数。
赋权图是指每条边都有一个(或者多个)实数对应的图,这个(些)实数称为这条边的权(每条边可以具有多个权)。赋权图在实际问题中非常有用。根据不同的实际情况,权数的含义可以各不相同。例如,可用权数代表两地之间的实际距离火车行车时间,也可用权数代表某工序所需的加工时间等。
4.1.2 图与网络的数据结构
这里介绍计算机上用来描述图与网络的两种主要表示方法:邻接矩阵表示法和稀疏矩阵表示法。在下面数据结构的讨论中,首先假设 是一个简单无向图,顶点集合 ,边集 ,记为 。
1. 邻接矩阵表示法:
邻接矩阵是表示顶点之间相邻关系的矩阵,邻接矩阵记为
,当
为赋权图时,有:
当 为非赋权图时,有:
采用邻接矩阵表示图,直观方便,通过查看邻接矩阵元素的值可以很容易地查找图中任意两个顶点 和 之间有无边,以及边上的权重。当图的边数 远小于顶点数 时,邻接矩阵表示法会造成很大的空间浪费。
2. 稀疏矩阵表示法:
稀疏矩阵是指矩阵中零元素很多,非零元素很少的矩阵。对于稀疏矩阵,只要存放非零元素的行标,列标,非零元素的值即可,可以按如下方式存储:
(非零元素的行地址,非零元素的列地址),非零元素的值。
在Matlab中,无向图和有向图邻接矩阵的使用上有很大差异。
对于有向图,只要写出邻接矩阵,直接使用Matlab的sparse命令,就可以将邻接矩阵转化为稀疏矩阵的表示方式。
对于无向图,由于邻接矩阵是对称阵,Matlab只需使用邻接矩阵的下三角元素,即Matlab只存储邻接矩阵下三角元素中的非零元素。
稀疏矩阵只是一种存储格式。Matlab中,普通矩阵使用sparse命令变成稀疏矩阵,稀疏矩阵使用full命令变成普通矩阵。
4.2 最短路径问题
4.2.1 两个指定顶点之间的最短路径
问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。
构造赋权图 。其中,顶点集 表示各个小城镇; 为边的集合;邻接矩阵 表示顶点 和 之间直通铁路的距离,若顶点 和 之间无铁路,则 。问题就是求赋权图 中指定的两个顶点 和 之间具有最小权的路径。这条路径称为 和 之间的最短路径,它的权称为 和 之间的距离,也可以被记为 。
求最短路径已有成熟的算法,如Dijkstra算法,其基本思想是按照距离 从近到远为顺序,依次求得 到 的各个顶点的最短路径,直到 (或者直至 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法的伪码描述。
(1)令 ,对 ,令 。
(2)