图的基本概念
子图:假设有两个图G = (v, E)和G′ = (v′, E′),如果v′⊆v且E′⊆ E,则称G′为G的子图。 例如,图6.2所示为图6.1中G1和G2的子图示例。
无向完全图和有向完全图:对于无向图,若具有n(n − 1)/2条边,则称为无向完全图。 对于有向图,若具有n(n − 1)条弧,则称为有向完全图。
稀疏图和稠密图:有很少条边或弧(如e<nlog2n)的图称为稀疏图,反之称为稠密图。
回路或环:第一个顶点和最后一个顶点相同的路径称为回路或环
简单路径、简单回路或简单环:序列中顶点不重复出现的路径称为简单路径。除了第 一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。
图的表示方法
邻接矩阵法
//-----图的邻接矩阵存储表示-----
#define MaxInt 32767//表示极大值,即∞
#define MVNum 100//最大顶点数
typedef char VerTexType;//假设顶点的数据类型为字符型
typedef int ArcType;//假设边的权值类型为整型
typedef struct
{
VerTexType vexs[MVNum];//顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum;//图的当前点数和边数 }AMGraph;
}AMGraph;
邻接矩阵表示法的优缺点
便于判断两个顶点之间是否有边,即根据A[i][j] = 0或1来判断。
便于计算各个顶点的度。对于无向图,邻接矩阵第i行元素之和就是顶点vi 的度;对于有 向图,第i行元素之和就是顶点vi 的出度,第i列元素之和就是顶点i的入度。
缺点:
不便于增加和删除顶点
不便于统计边的数目,需要查找邻接矩阵所有元素才能统计完毕,时间复杂度为O(n2 )。
空间复杂度高。
邻接表
一般来说知道怎么画就行,考试不会考代码的。
邻接表表示法的优缺点
优点
便于增加和删除顶点
便于统计边的数目,按顶点表顺序查找所有边表可得到边的数目,时间复杂度为 O(n + e)。适合表示稀疏图
缺点
不便于判断顶点之间是否有边,要判定vi和vj之间是否有边,就需查找第i个边表,最坏 情况下时间复杂度为O(n)。
有向图的十字链表法,知道怎么画,且知道是用于有向图的
【十字链表进阶版画法 三步秒杀 数据结构】 十字链表进阶版画法 三步秒杀 数据结构_哔哩哔哩_bilibili
前面相同的连横线,后面相同的连接竖线,还是一样先进行组队。
顶点的结点为三个数据,一个是存放顶点,一个存放横向关系,一个存放竖向关系的链表。边结点为四个,前两个存放有关系的两个结点第三个连接横向的,第四个连接纵向的链表。
无向图的连接多重表,知道怎么画就行,知道他是用于无向图的
【邻接多重表进阶版画法 三步秒杀 数据结构】 邻接多重表进阶版画法 三步秒杀 数据结构_哔哩哔哩_bilibili
临界多重表的顶点结点有两个数据,一个是顶点的编号一个是指针,边结点有四个数据,一条边两边的结点和他们连的下一个相同的结点
图的遍历
深度优先和广度优先的遍历会写就行了,代码大概不考
【【数据结构】04 图的两种遍历方式 深度优先遍历 广度优先遍历】 【数据结构】04 图的两种遍历方式 深度优先遍历 广度优先遍历_哔哩哔哩_bilibili
图的应用
最小生成树
prim算法和kruskal
关于迪杰斯特拉算法
我觉得还是用两个数组来实现比较简单,第一个数组是一个bool类型的数组,判断是否达到最短路径,第二个数组到达任意一点的距离
具体的视频就如上所示,讲解的很清楚了
【Dijkstra(迪杰斯特拉)算法理解】 Dijkstra(迪杰斯特拉)算法理解_哔哩哔哩_bilibili
迪杰斯特拉算法的时间复杂度为O(N^2)
弗洛伊德算法
AOV网
DAG图:有向无环图
AOV网:用顶点表示活动,弧表示活动的优先关系
AOV网中是没有环的
检测办法:对有向图进行拓扑排序,若网中所有的点进行拓扑排序,若顶点都在序列中,则无环
AOV网的拓扑排序的过程
1.选择图中一个无前驱的结点并且输出
2.删除该结点以及所有以它为尾的弧
3.重复1,2,直到没有点为止