小白基础之数据结构----图

线性结构、树形结构、图结构

当对线性结构中的结点放宽后继个数的限制时,就得到了树形结构,再对树形结构中的结点放宽了前趋个数的限制时,就得到了图结构。


把包含n个顶点,恰好有n(n-1)条边的有向图称为有向完全图;同理恰有n(n-1)/2条边的无向图称为无向完全图

在无向图中,若从顶点x到顶点y有路径,则称顶点x和y是连通的。若无向图任意两个不同的顶点x和y都连通,则称无向图为连通图。无向图的极大连通子图称为连通分量

如果一个无向图是连通图,则它的连通分量是其本身;若无向图不是连通图,则它可有若干个连通分量。

图的存储

       在线性表和树的存储中主要使用了顺序存储和链接存储两种方式。图的的存储同样也可以采用顺序方式和链接方式,但是在实际应用中与线性表和树的存储相比有一定的区别。

       在线性表和树中,结点表示要处理的数据,而边只表示结点之间的关系,所以在存储时,通常只存储待处理的数据,而结点之间的关系可以用位置隐含,也可以附加指针域来显示体现;而在图形结构中,边和点同样具有实际意义,都包含了将要处理的数据。因此,在图的存储中需要对图的顶点和边分别进行存储。对于顶点的存储,通常采用最简单的顺序存储方式,而对于边有多种方法:邻接矩阵法、邻接表法、边集数组法

邻接矩阵

邻接矩阵对图中的顶点采用顺序存储

对于一般的图,如果图中两个顶点之间有边,矩阵中对应的元素就存边上的权值。

无向图或者无向网络的邻接矩阵一定是个对称矩阵。

邻接表

邻接表是图的一种链接存储结构,在这种方法中,顶点仍然采用顺序方式进行存储,而用n个单链表来存储图中的边。

邻接表中的每个顶点表结点应包含两个域:一个是顶点域,用来存放顶点的信息;另一个是指针域,用于存放与顶点相关联的所有边链接成的边表头指针。

边集数组

图的边集数组是图的一种顺序存储方式,利用一维数组来存储图中所有的边。

图的遍历

深度优先搜索遍历(Depth-First Search)

任选一顶点开始,找一个未曾访问过的点,顺着一直找,如果没有,那就跳回上一个点,找它的未曾访问的点。

对图进行深度优先搜索遍历时,按访问点的先后次序所得到的顶点序列,称为该图的深度优先搜索遍历序列,简称DFS序列

将得到此DFS序列时所经过的边按顺序连接起来,形成一个无回路的连通图,即为一棵树,简称为DFS生成树

广度优先搜索遍历(Breadth-First Search)

任选一顶点,访问该顶点的所有未曾访问过的顶点,然后下一个顶点,依次再访问其所有未曾访问过的顶点。

同样,也有BFS序列、BFS生成树

非连通图的遍历

如果一个无向图是非连通图,则从图中任意一个顶点出发进行深度优先搜索或广度优先搜索都不能访问到图中所有的顶点,而只能访问到包含初始出发点的连通分量中的所有顶点。有几个连通分量,则对应几棵生成树,由此就构成了生成森林。


最小生成树

我们把连通网络的所有生成树中边上权值之和最小的生成树称为最小生成树

prim算法

任选一个顶点,找到其权值最小的一条路径,顺到下个点,再继续找。

Kruskal算法

所有顶点,找到权值最小的边,依次顺序找,然后构成一个连通图。

单源最短路径

即从图中某一个顶点到达其余各个顶点的最短路径。

  • Dijkstra算法

任意两点间的最短路径

  • Floyd算法

拓扑排序

拓扑排序的目的是将有向无环图中所有的顶点排成一个线性序列,通常称为拓扑序列。

简单说就是做某一件事前提必须做另一件事。

一般情况下,可用图中的顶点表示活动,顶点之间的有向边表示活动之间的先后次序关系,称这样的有向图为顶点活动网(Activity On Vertex Network),简称AOV网。

所以一个有环的有向图是不能进行拓扑排序的。因此,对给定的有向图,可以通过他的拓扑序列来判断图中是否存在环。当所有顶点都排入一个拓扑序列中,此图一定是无环图。

关键路径

拓扑排序是AOV网上的重要运算,而关键路径则是AOE网(Activity On Edge Network)。在实际应用中,AOE网通常可以表示一个工程的网络计划图,是一个带权的有向无环图。

猜你喜欢

转载自blog.csdn.net/qq_36923376/article/details/88538865