图论知识及运用举例文档格式.docx
《图论知识及运用举例文档格式.docx》由会员分享,可在线阅读,更多相关《图论知识及运用举例文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
为边
的端点,并称
与
相邻(adjacent);
边
称为与顶点
关联(incident)。
如果某两条边至少有一个公共端点,则称这两条边在图
中相邻。
边上赋权的无向图称为赋权无向图或无向网络(undirectednetwork)。
我们对图和网络不作严格区分,因为任何图总是可以赋权的。
一个图称为有限图,如果它的顶点集和边集都有限。
图
的顶点数用符号
表示,边数用
表示。
当讨论的图只有一个时,总是用
来表示这个图。
从而在图论符号中我们常略去字母
,例如,分别用
代替
端点重合为一点的边称为环(loop)。
一个图称为简单图(simplegraph),如果它既没有环也没有两条边连接同一对顶点。
2.2有向图
定义一个有向图(directedgraph或digraph)
中某些元素的有序对集合
的顶点集或节点集,
称为该图的一个顶点或节点;
的弧集(arcset),
的有序对)
的弧(arc)。
当弧
为
的尾(tail),
的头(head),并称弧
的出弧(outgoingarc),为
的入弧(incomingarc)。
对应于每个有向图
,可以在相同顶点集上作一个图
,使得对于
的每条弧,
有一条有相同端点的边与之相对应。
这个图称为
的基础图。
反之,给定任意图
,对于它的每个边,给其端点指定一个顺序,从而确定一条弧,由此得到一个有向图,这样的有向图称为
的一个定向图。
以下若未指明“有向图”三字,“图”字皆指无向图。
2.3完全图、二分图
每一对不同的顶点都有一条边相连的简单图称为完全图(completegraph)。
个顶点的完全图记为
若
,
(这里
表示集合
中的元素个数),
中无相邻顶点对,
中亦然,则称
为二分图(bipartitegraph);
特别地,若
,则
,则称
为完全二分图,记成
2.4子图
叫做图
的子图(subgraph),记作
,如果
是
的子图,则
称为
的母图。
的支撑子图(spanningsubgraph,又成生成子图)是指满足
的子图
2.5顶点的度
设
中与
关联的边数(每个环算作两条边)称为
的度(degree),记作
是奇数,称
是奇顶点(oddpoint);
是偶数,称
是偶顶点(evenpoint)。
关于顶点的度,我们有如下结果:
(
)
)任意一个图的奇顶点的个数是偶数。
2.6图与网络的数据结构
网络优化研究的是网络上的各种优化模型与算法.为了在计算机上实现网络优化的算法,首先我们必须有一种方法(即数据结构)在计算机上来描述图与网络。
一般来说,算法的好坏与网络的具体表示方法,以及中间结果的操作方案是有关系的。
这里我们介绍计算机上用来描述图与网络的5种常用表示方法:
邻接矩阵表示法、关联矩阵表示法、弧表表示法、邻接表表示法和星形表示法。
在下面数据结构的讨论中,我们首先假设
是一个简单有向图,
,并假设
中的顶点用自然数
表示或编号,
中的弧用自然数
表示或编号。
对于有多重边或无向网络的情况,我们只是在讨论完简单有向图的表示方法之后,给出一些说明。
)邻接矩阵表示法
邻接矩阵表示法是将图以邻接矩阵(adjacencymatrix)的形式存储在计算机中。
的邻接矩阵是如下定义的:
是一个
的
矩阵,即
也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;
否则为0。
可以看出,这种表示法非常简单、直接。
但是,在邻接矩阵的所有
个元素中,只有
个为非零元。
如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。
)关联矩阵表示法
关联矩阵表示法是将图以关联矩阵(incidencematrix)的形式存储在计算机中.图
的关联矩阵
是如下定义的:
的矩阵,即
也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。
如果一个节点是一条弧的起点,则关联矩阵中对应的元素为1;
如果一个节点是一条弧的终点,则关联矩阵中对应的元素为
;
如果一个节点与一条弧不关联,则关联矩阵中对应的元素为0。
对于简单图,关联矩阵每列只含有两个非零元(一个
,一个
)。
可以看出,这种表示法也非常简单、直接。
此外,还有邻接表表示法,弧表示法,星形表示法等。
2.7轨与连通
,其中
关联,称
是图
的一条道路(walk),
为路长,顶点
分别称为
的起点和终点,而
称为它的内部顶点。
若道路
的边互不相同,则
称为迹(trail)。
的顶点互不相同,则
称为轨(path)。
称一条道路是闭的,如果它有正的长且起点和终点相同。
起点和终点重合的轨叫做圈(cycle)。
若图
的两个顶点
间存在道路,则称
连通(connected)。
间的最短轨的长叫做
间的距离。
记作
的任二顶点均连通,则称
是连通图。
显然有:
)图
是一条轨的充要条件是
是连通的,且有两个一度的顶点,其余顶点的度为2;
是一个圈的充要条件是
是各顶点的度均为2的连通图。
3应用—最短路问题
3.1两个指定顶点之间的最短路径
问题如下:
给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。
以各城镇为图
的顶点,两城镇间的直通铁路为图
相应两顶点间的边,得图
对
的每一边
,赋以一个实数
—直通铁路的长度,称为
的权,得到赋权图
的子图的权是指子图的各边的权和。
问题就是求赋权图
中指定的两个顶点
间的具最小权的轨。
这条轨叫做
间的最短路,它的权叫做
间的距离,亦记作
求最短路已有成熟的算法:
迪克斯特拉(Dijkstra)算法,其基本思想是按距
从近到远为顺序,依次求得
的各顶点的最短路和距离,直至
(或直至
的所有顶点),算法结束。
为避免重复并保留每一步的计算信息,采用了标号算法。
下面是该算法。
)令
,对
,令
)对每个
),用
计算
,把达到这个最小值的一个顶点记为
).若
,停止;
,用
,转(
算法结束时,从
到各顶点
的距离由
的最后一次的标号
给出。
在
进入
之前的标号
叫T标号,
时的标号
叫P标号。
算法就是不断修改各项点的T标号,直至获得P标号。
若在算法运行过程中,将每一顶点获得P标号所由来的边在图上标明,则算法结束时,
至各项点的最短路也在图上标示出来了。
例1某公司在六个城市
中有分公司,从
的直接航程票价记在下述矩阵的
位置上。
表示无直接航路),请帮助该公司设计一张城市
到其它城市间的票价最便宜的路线图。
用矩阵
为顶点个数)存放各边权的邻接矩阵,行向量
、
分别用来存放
标号信息、标号顶点顺序、标号顶点索引、最短通路的值。
其中分量
存放始点到第
点最短通路中第
顶点前一顶点的序号;
存放由始点到第
点最短通路的值。
求第一个城市到其它城市的最短路径的Matlab程序如下:
clear;
clc;
M=10000;
a(1,:
)=[0,50,M,40,25,10];
a(2,:
)=[zeros(1,2),15,20,M,25];
a(3,:
)=[zeros(1,3),10,20,M];
a(4,:
)=[zeros(1,4),10,25];
a(5,:
)=[zeros(1,5),55];
a(6,:
)=zeros(1,6);
a=a+a'
;
pb(1:
length(a))=0;
pb
(1)=1;
index1=1;
index2=ones(1,length(a));
d(1:
length(a))=M;
d
(1)=0;
temp=1;
whilesum(pb)<
length(a)
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb
(1));
pb(temp)=1;
index1=[index1,temp];
index=index1(find(d(index1)==d(temp)-a(temp,index1)));
iflength(index)>
=2
index=index
(1);
end
index2(temp)=index;
end
d,index1,index2
3.2每对顶点之间的最短路径
计算赋权图中各对顶点之间最短路径,显然可以调用Dijkstra算法。
具体方法是:
每次以不同的顶点作为起点,用Dijkstra算法求出从该起点到其余顶点的最短路径,反复执行
次这样的操作,就可得到从每一个顶点到其它顶点的最短路径。
这种算法的时间复杂度为
第二种解决这一问题的方法是由FloydRW提出的算法,称之为Floyd算法。
假设图
权的邻接矩阵为
来存放各边长度,其中:
之间没有边,在程序中以各边都不可能达到的充分大的数代替;
之间边的长度,
对于无向图,
是对称矩阵,
Floyd算法的基本思想是:
递推产生一个矩阵序列
表示从顶点
到顶点
的路径上所经过的顶点序号不大于
的最短路径长度。
计算时用迭代公式:
是迭代次数,
最后,当
时,
即是各顶点之间的最短通路值。
例2最短路问题(SPP-shortestpathproblem)
一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。
从甲地到乙地的公路网纵横交错,因此有多种行车路线,这名司机应选择哪条线路呢?