读书笔记之《数据结构》---第七章 图

本章目录
1.图的定义和术语
2.图的存储结构
3.图的遍历
4.图的连通性问题

图的定义和术语
图中的数据元素通常称为顶点,
<v,w>是从v到w的一条弧,v是弧尾,w是弧头,此图称为有向图。
(v,w)表示v和w的一条边,此图为无向图。

n个顶点的图,有1/2n(n-1)条边的无向图称为完全图,有n(n-1)条弧的有向图称为有向完全图,很少条边或弧的称为稀疏图,反之称为稠密图。每条边或弧都有与它相关的权值的图称为网。
图中的一部分生成的图称为子图。
顶点v的度:是和v相关联的边的数目。
出度:有向图中以v为尾的弧的数目
入度:有向图中以v为头的弧的数目

从顶点v到n有路径,则称v和n是连通的。
图中任意两点都是连通的,则称图是连通图。
连通分量:指无向图中的极大连通子图。
有向图中:任意两点vi和vj都有从vi到vj和从vj到vi的路径,则称为强连通图。
极大强连通子图称为强连通分量。

图的存储结构
图采用多重链表存储结构和数组存储结构,常用的有邻接表,连接多重表和十字链表。

邻接矩阵存储法:
在这里插入图片描述

邻接表:在邻接表中,对每个顶点建立一个单链表,表中的结点表示依附于该点的边。
在这里插入图片描述
在这里插入图片描述

逆邻接表:图中的结点的单链表的记录以该顶点为头的弧的信息。
在这里插入图片描述

十字链表:将连接表和逆邻接表结合起来的一种链表。
在这里插入图片描述
在这里插入图片描述

邻接多重表:
在这里插入图片描述

在这里插入图片描述

扫描二维码关注公众号,回复: 3723116 查看本文章

图的遍历

深度优先搜索:类似于树的先根遍历,visited[i]==true表示该顶点已经被访问过。用递归实现如下代码
在这里插入图片描述

用栈实现:从顶点v出发,将v入栈,开始循环(退出条件,栈为空),如果栈不为空弹出栈顶元素,访问该元素,将该元素的所有未被访问过的邻接点入栈。

广度优先搜索:类似于树的按层次遍历过程,用队列实现,原理,从顶点v出发,访问v,并v入队列,开始循环(退出条件,队列为空),取出队头元素,并访问队头元素的未被访问的邻接点并依次入队列。如下代码
在这里插入图片描述

图的连通性问题

在无向图的遍历过程中,对于连通图,只需要从一个顶点出发,就可以遍历整个图,但非连通图中需要从多个顶点出发遍历多次,每次遍历获得该图的一个连通分量。

有向图的强连通分量:从某一个顶点出发,沿着出弧的方向深度优先遍历图,并将图中顶点以该顶点退出递归函数DFS的顺序进行标记(出发的肯定是最后退出递归函数的点),当遍历完成是,出弧方向能访问的点的退出递归函数的顺序记录完成了,然后选择最后退出递归函数DFS的点(第一次逆向深度遍历,肯定是从出发点开始),进行沿着同一方向遍历入弧,遍历完成得到一个强连通分量,在从剩下的最后被访问的顶点继续逆向深度搜索,获得其他强连通分量。

最小生成树算法:

普里姆算法:顶点集合N,辅助顶点集合S,初始化中,将出发点vi加入S,并从N中删除
1.从点vi出发找到vj不在S中的vi最短的邻边,(vi,vj),存储该边,将vj从N一道S中
2.在从vj出发找到vx不在S中的vj的最短的邻边,(vj,vx),vx不能再S中,存储该边,将
3.重复2步骤直至所有顶点加入S集合
普里姆算法:与边的多少关系不大,适合计算边稠密的图

克鲁斯卡尔算法:将图中的N个订单分成Ni个点集合,T是边集合,TE是最小生成树的边集合。
1.从T中找出一条最短的边,这条边是连接两个不同集合的边
2.将该边的顶点所在的集合合并成一个集合,将边的两点和值记录到TE中
3.从T中删除该边
4.重复步骤1-3,知道所有顶点合并成一个集合
在这里插入图片描述
克鲁斯卡尔算法适合计算边稀疏的图

关节点:可以将一个连通分量分割成两个或多个连通分量的点。
重连通图:没有关节点的图,在重连通图中任意两点之间至少存在两条路径

关节点求法:算法较难理解,算法结合了先序深度搜索和后序深度搜索,先序深度搜索确定每个点访问的顺序,而后序深度搜索则根据先序计算的顺序确定关节点。具体递归算法步骤:
递归算法:递归算法中,第一部分为记录结点访问次序,中间部分为调用递归函数访问子节点,第三部分为根据递归函数的退出,来确定结点的回边。
1.从vi开始,调用递归算法
2.一直递归到某个点s(该没有未被访问的邻接点),这个点有两种状况,第一种是没有回边,只有一条指向双亲的边,则记录该结点的回边值为该结点的双亲的访问顺序值,第二种是有回边,则记录该点回边值为指向最先访问的祖先的访问循序值,退出递归函数
3.从第二步退出递归函数后,如果s结点为无回边状况,则判断s的父节点为关节点,如果为有回边状况,则s结点的回边值肯定小于双亲的访问循序值,则将双亲的回边值也跟新为该值。
4.重复2,3步骤。
在这里插入图片描述
在这里插入图片描述

算法解析:该算方法看是使用的是先序深度遍历,实则先序深度遍历只是用于确定结点的 访问顺序,而真正进行关节点判断的为后序深度遍历。

有向无环图
全序关系:若集合X上的关系R是自反的、对称的和传递的,则R是集合X的一个全序关系
例如三角形相似关系,三角形A与自身相似满足自反性,A相似B,则B相似于A,满足对称性,A相似于B,B相似于C,则A相似于C满足传递性,则三角形相似关系是三角形集合中的一个全序关系
偏序关系:若集合X上的关系R是自反的、反对称的和传递的,则R是集合X的一个偏序关系
例如大于等于关系:A >= B,且B>=A,则A=B,满足反对称,A >= A满足自反,A>=B,B>=C,则A >= C满足传递,则大于等于关系是实数R上的偏序关系。

AOV网:顶点表示活动,用弧表示活动优先关系的有向图
AOE网:弧带有权值的AOV网

关键路径:最早开始时间和最晚开始时间相同的活动组成的路径
在这里插入图片描述

最短路径
迪杰斯特拉算法:
矩阵二位数组矩阵T存储顶点vi到各顶点的最短路径值,初始状态为邻接顶点为弧的权值,非邻接顶点为无穷大。数组S用于存储最短路径,存储单元为该弧的前驱顶点的下标和与前驱顶点之间的弧的权值。
1.从T中找出一条弧值最小的弧(vi,vj),将该弧加入S中,并根据vj的邻接点vx更新T,如果(vi,vj)+(vj ,vx) < (vi,vx),则更新(vi,vx)为(vi,vj)+(vj ,vx) ,并记录其vx的前驱为vj
2.从T中找出不在S中的剩余的弧中权值最小的重复1步骤。
在这里插入图片描述

弗洛伊德算法:
算法思想,以每一个顶点为中介值去更新矩阵。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_25744595/article/details/83272906