数据结构 图-详细介绍

图的基本定义和术语

一、图的定义
图是由顶点的非空有穷集合(用V表示该集合)与顶点之间的关系(边或弧)的集合(用E表示该集合)构成的结构。
可以形式化表示为G=(V,E)

其中,V为顶点的非空有穷集合,E为关系的有穷集合。

数据结构 图-详细介绍_第1张图片
对于图中任意一条边(Vi,Vj),若(Vi,Vj)是订单的无序偶对,这样的图称为无向图。若
(Vi,Vj)是订单的有序偶对,记作(Vi,Vj),这样的图称为有向图。直观地判断,无向图中的所有边都不带有箭头,而有向图中的所有边(习惯称之为弧)都带有箭头。

边上带权的图称为带权图,带权的连通图称为网络

二、图的有关名词术语
(1)顶点的度:所谓某个顶点V的度是指依附于该顶点的边或弧的数量,记作D(V).对于无向图而言,仅此而已。而对于有向图,要区分订单的出度与入度的概念。所谓一个顶点V的出度是指以该顶点为出发点的弧的数量,记作OD(V).所谓一个顶点V的入度是指以该顶点为终止点的弧度的数量,记作ID(V).D(V)=OD(V)+ID(V).

结论
a.所有顶点的度之和等于边或弧的条数2倍
b.具有n个顶点的无向图中边的数目最多为n(n-1)/2.具有n个订单的有向图中边(弧)的数目最多为n(n-1).

(2)路径:顶点Vx与Vy之间有路径是指存在着顶点序列Vx,Vi1,Vi2…Vy,并且序列中相邻两个元素构成的订单偶对分别表示图中的一条边或弧。这里,称Vx为出发点,Vy为终止点,出发点与终止点相同的路径称为环或回路。序列中订单不重复出现的路径称为简单路径。

对于不带权的图,两个顶点之间的路径长度是指该路径上所有经过的边的数目。对于带权的图,两个顶点之间的路径长度是指该路径上所经过的边上的权值之和。

(3)子图:对于G=(V,E)与G’=(V’,E’),若有V’∈V,E’∈E, 则称G’是G的一个子图,一个图是其自身的子图。

(4)图的连通
无向图的连通:若顶点Vx与Vy之间有路径,就称Vx与Vy是连通的,若图中任意两个顶点之间都有路径,就称该无向图是连通的。

数据结构 图-详细介绍_第2张图片
有向图的连通:若顶点Vx与Vy之间有路径,并且顶点Vy与Vx之间也有路径,就称Vx与Vy是连通的,若图中任意两个订单之间都有连通,就称该该有向图是强连通的。

数据结构 图-详细介绍_第3张图片
连通分量:无向图中的极大连通子图。任何一个连通图的连通分量只有一个,是它本身
数据结构 图-详细介绍_第4张图片
强连通分量:有向图中的极大连通子图。
数据结构 图-详细介绍_第5张图片
数据结构 图-详细介绍_第6张图片

第二节 图的存储结构

对于具有n个顶点的图,最常采用的存储方法有邻接矩阵存储方法与邻接表存储方法。

一、邻接矩阵表示法

1、邻接矩阵
设G(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵:

在这里插入图片描述
数据结构 图-详细介绍_第7张图片

2,采用邻接矩阵存储方法具有以下特点:
a.无向图的邻接矩阵一定是一个对称矩阵。因此,按照压缩存储的思想,在具体存放邻接矩阵时只需要存放上(或者下)三角形阵的元素即可。
数据结构 图-详细介绍_第8张图片

b.不带权的有向图的邻接矩阵一般来说是一个稀疏 矩阵(特别是对于稀疏图),于是可以采用三元组表的方法存储邻接矩阵。
数据结构 图-详细介绍_第9张图片

c.对于无向图,邻接矩阵的第i行(或者第i列)非零元素(或者非∞元素)的个数正好是第i个顶点的度D(Vi).

d.对于有向图,邻接矩阵的第i行(或者第i列)非零元素(或者非∞元素)的个数正好是第i个订单的出度OD(Vi(或者入度ID(Vi))。

e.对于无向图,邻接矩阵的所有非零元素(或者非∞元素)的个数正好是边数的二倍。

f.对于有向图,邻接矩阵的所有非零元素(或者非∞元素)的个数正好等于弧度。

g.一个图的邻接矩阵表示是唯一的。

在这里插入图片描述

3.邻接矩阵表示的存储结构定义

在这里插入图片描述

4.建立一个无向网的算法
数据结构 图-详细介绍_第10张图片
算法时间复杂度O(n^2)

二.邻接表表示法
1.邻接表
对于具有n个订单的图建立n个线性表。每一个链表最前面都分别设置一个称之为顶点表结点,n个顶点构成一个数组结构。第i个链表中的每一个链接点称之为边表结点。

数据结构 图-详细介绍_第11张图片
数据结构 图-详细介绍_第12张图片
2.采用邻接表存储方法具有以下特点:

a.一个图的邻接表表示法不唯一,这是因为邻接表中个节点的链接次序取决于建立邻接表的算法(前插法还是后插法建链表)及边的输入次序。

b.对于无向图,若它有n个顶点,e条边,则其邻接表中需要2e+n个结点。其中有2e个边表结点,n个顶点表结点。边表结点的个数一定是偶数,为边数的2倍。

c.对于有向图,若它有n个顶点,e条边,则其邻接表中需要e+n个结点。其中有e个边表结点,n个顶点表结点。

d.对于无向图,第i个链表中的边表结点的数目是第i个顶点的度。

e.对于有向图,第i个链表中的边表结点的数目是第i个顶点的出度。在其逆邻接表中,第i个链表中的边表示结点的数目是第i个顶点的入度。

3.图的邻接表示存储结构定义
数据结构 图-详细介绍_第13张图片
4.无向图邻接表的建表算法
数据结构 图-详细介绍_第14张图片
建立有向图的邻接表更加简单,每当读入一个顶点对,仅需要生成一个邻接点需要为j的边表结点,将其插入到Vi的出边表头即可。

第三节 图的遍历

图的遍历:从某个顶点出发,沿着某条搜索路径对图中每个顶点做且仅做一次访问。图的遍历最常用的是深度优先搜索遍历和广度优先搜索遍历两种方法。

一、深度优先搜索遍历

1、深度优先搜索遍历思想:

深度优先搜索(depth First Search,DFS)遍历类似于树的前序(先根)遍历。假设初始状态是图中所有顶点都未曾访问过,则可从图G中任选一顶点V为初始出发点,首先访问出发点V,并将其标记为已访问过;然后依次从V出发搜索V的每个邻接点W,若W未曾访问过,则以W作为新的出发点出发,继续进行深度优先遍历,直到图中所有和V有路径相同的顶点都被访问到;若此时图中任有顶点未被访问,则另选一个未曾访问的顶点作为起点,重复上述过程,直到图中所有顶点都被访问到为止。
数据结构 图-详细介绍_第15张图片

2.以邻接矩阵为存储结构的深度优先搜索遍历算法
数据结构 图-详细介绍_第16张图片

3.以邻接表为存储结构的深度优先搜索遍历算法
数据结构 图-详细介绍_第17张图片

二、广度优先搜索遍历

1、广度优先搜索遍历思想

广度优先搜索(BFS)遍历类似于树的按层次遍历。其基本思想是:首先访问出发点Vi,接着依次访问Vi的所有未被访问过的邻接点Vi1,Vi2…Vit,并均标记为已访问过,然后在按照Vi1,Vi2…Vit的次序,访问每一个顶点的所有未曾访问过的顶点并均标记为已访问过,依次类推,直到图中所有和初始出发点Vi有路径相通的顶点都被访问过为止。

数据结构 图-详细介绍_第18张图片

2.已邻接矩阵为存储结构的广度优先搜索遍历算法

数据结构 图-详细介绍_第19张图片
3.以邻接表为存储结构的广度优先搜索遍历算法

数据结构 图-详细介绍_第20张图片
在这里插入图片描述
注意:由于图G=(V,E)中顶点集合V与边的集合E中元素的排列是任意的,在采用邻接表存储以后,如果存放顶点结点先后顺序不同,或者边结点的链接次序不同,在按照某种方式遍历图时,将会影响到顶点被访问的先后顺序,即经过遍历得到的遍历序列有可能不同。即使存储结构确定,如果指定的出发顶点不同,遍历结果也会不同。当然,对于某种已经确定的存储结构与指定的出发顶点,按照某种遍历算法得到的遍历结果应该是唯一的。

数据结构 图-详细介绍_第21张图片

在这里插入图片描述

B

在这里插入图片描述
在这里插入图片描述
A

数据结构 图-详细介绍_第22张图片

第四节 图的生成树和最小生成树

一.图的生成树

1.生成树的概念

对于具有n个顶点的连通图,包含了该图的全部n个顶点,仅包含它的n-1条边的一个极小连通子图被称为生成树。

一个图的生成树为一个无回路的连通图。也就是说,若在图中任意添加一条边,就会出现回路;若在图中去掉任何一条边,都会使之称为非连通图。

一个连通图的生成树不一定是唯一的。

数据结构 图-详细介绍_第23张图片

由深度优先搜索所得的生成树称为深度优先生成树,简称为DFS生成树;
而由广度优先搜索所得的生成树称为广度优先生成树,简称BFS生成树。

【例】下图中图(b) 是图(a)从V0开始的深度优先搜索所得的生成树,图(c)是图(a)从V0开始的广度优先搜索的生成树。
数据结构 图-详细介绍_第24张图片

二.最小生成树

1.最小生成树的概念

对于连通的带权图(网)G,其生成是也是带权的。把生成树个边的权值综合称为该树的权,把权值最小的生成树称为图的最小生成树(Mininum Spanning Tree.MST)。

数据结构 图-详细介绍_第25张图片

2.普里姆(Prim)算法

(1)算法思想

用自然语言描述的Prim算法:设G = ( V , GE ) 为具有n个顶点的带权连通图,T=(U, TE)
为G的一个子图,初始时,有TE=空,U={V1} , V1∈V. Prim算法描述为:从G中选中一个顶点仅在V中,而另一个顶点在U中,并且权值最小的边加入集合TE中,同时将该边仅在V中的那个顶点加入集合U中。重复上述过程n-1次,直到U=V,此时T为G的最小生成树。

数据结构 图-详细介绍_第26张图片
分析: 算法一开始去u=[1],然后到V-U中找到一条代价最小且依附于顶点1的边,(u0,v0)=(1,3), 将vo= 3加入集合U中, 修改辅助数组中的值。使minedge[3].lowcost= 0;
以表示顶点3已并入U,由于边(3,6)上的权值是一条最小且依附于顶点集U中顶点的边,因此修改minedge[6]的值,以此类推,直到U=V,其过程如表所示。

数据结构 图-详细介绍_第27张图片

(2)算法描述

附设一个辅助数组minedge[vtxptr],记录从U到V-U具有最小代价的边。对每个顶点v∈V-U,
在辅助数组中存在一个分量minedge[v],它包括两个域,其中low cost存储该边商的权值,ver域存储该边的依附在U中的顶点。Minedge[v]=min{cost(u,v),u∈U},(cost(u,v)表示该边的权)。

数据结构 图-详细介绍_第28张图片
数据结构 图-详细介绍_第29张图片
数据结构 图-详细介绍_第30张图片
数据结构 图-详细介绍_第31张图片

3.克鲁斯卡尔(Krtskal)算法

(1)算法思想
假设G=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是G的最小生成树,U的初值等于V,即包含有G中的全部顶点。T的初始状态时只含有n个顶点而无边的森林T=(V,空)。

该算法的基本思想是:将图G中的边按权值从小打到的顺序依次选取E中的边(u,v),若选取的边使生成树T不形成回路,则把他们并入TE中,保留作为T的一条边;若选取的边使生成树T形成回路,则将其舍弃,如此进行下去直到TE中包含n-1条边为止,此时的T即为最小生成树。

在这里插入图片描述

数据结构 图-详细介绍_第32张图片

第五节 最短路径

1.最短路径的问题

最短路径问题的提法很多,在这里仅讨论单源最短路径问题:从某个源点S∈V到G中其余各顶点的最短路径。对于求多源点的最短路径问题,可以用每个顶点作为源点调用一次单源最短路径问题算法予以解决。

【例】下图所示带权有向图,假设以V1为源点,则v1到其他个顶点的最短路径下表示。

数据结构 图-详细介绍_第33张图片

2.迪杰斯特拉(Dijkstra)算法

该算法是典型的最短路径路由算法,用于计算一个顶点到其他所有顶点的最短路径。主要特点是以起点为中心向外层扩展,直到扩展到终点为止。

【算法思想】创建三个数组,数组S记录了当前从源点到该顶点存在最短路径的顶点集合;数组dist(D)记录当前状态源点到图中其余各顶点之间的最短路径长度;数组path(简称P)是最短路径的路径数组,其中path[j] 表示从源点到顶点j的最短路径上顶点的前驱顶点。每一次循环都是从数组D中选中未被加入到数组S中的顶点到源点路径最短的顶点加入到数组S中,然后对数组D和数组P进行修改,直到所有顶点都加到了数组S中为止。

【例】已知有向图如图所示,根据迪杰斯塔拉算法画出求源点V1开始的单源最短路径的过程,以及算法执行过程。

数据结构 图-详细介绍_第34张图片

第六节 拓扑排序

1.拓扑排序的概念

对一有向图,如果从vi到vj存在一条路径,且在由图中所有顶点构成的线性系列中,vi总在vj之前,那么这样的线性序列就被称为拓扑序列。构造一个有向图的拓扑序列的过程称为拓扑排序。

	一个有向图必须满足两个条件才存在拓扑序列:
	a.初始时有向图中必须至少有一个入度0的顶点。
	b.有向图中不存在的回路。
	满足以上两条件的有向图称为AOV网。

2.拓扑排序过程是:
a.从有向图中选择一个入度为0的顶点;
b.从有向图中将该顶点以及由该顶点发出的所有弧全部删除;
c.重复上述过程,直到剩余的网中不再存在入度为0的顶点。

数据结构 图-详细介绍_第35张图片

数据结构 图-详细介绍_第36张图片

数据结构 图-详细介绍_第37张图片

小结:
着重介绍了图的基本概念和一些重要的图结构上的运算。重点是:图的邻接矩阵和邻接表两种存储
表示;图的深度优先搜索和广度优先搜索遍历算法、生成树和最小生成树以及prim和Kruskal算法思想,并能够应用这些方法给出给定图的深度优先、广度优先遍历序列和构造最小生成树。

还介绍了求最短路径的迪杰斯特拉(Dijkstra)算法和拓扑排序算法的基本思想,这些也是需要掌握和理解的内容。

你可能感兴趣的:(有向图,数据结构)