考纲
1.图的基本概念
(什么是图,图的术语)
2.图的存储和基本操作
(邻接矩阵,邻接表,十字链表(有向图),临界多重表(无向图))
3.图的遍历
(深搜 Depth First Search–DFS, 广搜 Breadt First Search–BFS)
4.图的应用
(最小生成树,最短路径,拓扑排序–AOV图,求关键路径–AOE)
大体的知识点都概括在这了,
明确
1.是什么(知识点定义),
2.为什么(这是知识点为了解决什么问题),
3.怎么用(知识点是怎么运作的)
1.图的基本概念
1.1图的定义
什么是图?(标准定义就不说了,毕竟这我是个人的笔记),顶点集合和边集合构成。。巴拉巴拉。。。
但易错点在于,一个图可以边都为空,但顶点不能为空;线性表可以是空表,树可以是空树,但没有空图一说。
1.2 基本术语
多了不扯,只谈易混淆的
1.简单图(数据结构只讨论简单图)
与之相对的是多重图,即不是多重图就是简单图,
简单图满足:
1)不存在重复的边 ,
2)不存在自己到自己的边(没有“自成环”,而不是没有回路)
2.简单路径,简单回路
这三者都是带简单啥的,注意区分;
顶点不重复出现的路径叫简单路径。
除了第一个顶点和最后一个顶点相同,其他顶点都不重复出现的回路叫简单回路。
3.连通、连通图、强连通图、连通分量、强连通分量
1)两个顶点之间有路径,这两个点就是连通的;
2)任意两个顶点都连通的图是连通图;强连通图是针对有向图的(两个顶点互相都有到对方的边)
3)图中的极大连通子图叫做连通分量。
4.极大连通子图、极小连通子图
1)极大连通子图就是连通分量。(不需包括所有顶点
2)极小连通子图又叫生成树,必须包括所有的顶点,边是n-1,加上一个边就有回路,删除一个边就不连通。
(选择题考点)
1)n个顶点的完全图的边数:无向图: n(n-1)/2 , 有向图边是二倍 : n(n-1)
2)非连通图边最多情况:n-1个顶点先构成完全图, 再加一个边就是连通了。
3)连通图边最少情况:那不就是树(生成树,即最小连通子图),边是 n-1 呗
4)有向强连通图边最少情况:一个环,边为n
2.图的存储及基本操作
这一节的考点
选择:邻接表和邻接矩阵的性质对比,时空复杂度对比。十字链表和邻接多重表考的浅。
综合:画出一个图的邻接矩阵或邻接表,判断度是多少,是否有边,A²矩阵啥意思。
算法:
1)这两个数据结构如何定义
2)邻接表改为邻接矩阵存储
2.1邻接矩阵
一维数组存顶点,二维数组存边(一条边依附的两个点);
二维数组就是矩阵,把有边的两个点对应的某行某列置为1,否则为0
(带权时∞或0表示不存在边)
存储结构定义
王道书上是用C写的,我也用C吧,(C++感觉比较简洁
typedef struct{
VertexType Vex{Maxsize]; //定义了一个顶点类型的一维数组,(即顶点表)
EdgeType Edge{Maxsize]{Maxsize]; //边类型的二维数组,(即邻接矩阵)
int vexnum,arcnum; //顶点数和边数
}MGraph;
分析一波特点:
1.空间复杂度:明显用了二维数组: O(n²),
2.图用矩阵表示法是唯一的
3.无向图矩阵是对称的,可以压缩存储,但会失去随即存储特性。
4.适合稠密图
如何求度?
无向图:顶点 i 的度为 矩阵第i行非零元素或者第i列的非零元素的个数;
时间复杂度 O(n)
有向图: 第i行是出度,第i列是入度,行加列为度。(简写了,我能看懂就行)
时间复杂度 O(n)
A²[i][j]那一点的值 = 顶点 i 到 j 路径长度为2 的路径条数
2.2邻接表
为什么要搞一个邻接表出来,我有矩阵还不行吗?
矩阵很香,但是太浪费内存,而邻接表是顺序存顶点,链式存边,减少了浪费
邻接表的定义需要先构建两个结构体,顶点表节点,边表节点
边表即单链表,需要定义节点,(指向下一个节点的指针才能连成链)这我知道。
你个一维数组存储的顶点要定义啥结构体?要自行车?
顶点也需要指针! 即指向第一个边的指针,而且这个指针是边表结点指针类型噢
存储结构定义
1.(边表的定义)每一个顶点都会扯出来一条单链表,
邻接表:从该点指向其他点(出度为链表的元素个数)
逆邻接表:从其他点指向该点(入度为链表元素个数)
typedef struct ArcNode{
int adjvex; //边表里的data存的啥,依附的顶点所在顶点表的下标
//(依附了两个顶点,存哪个?)->这就是邻接表和逆邻接表的区别
struct ArcNode *next; //指向下一个边节点的指针
}ArcNode;
2.顶点表(顺序表的定义)
typedef struct {
VertextType data; //顶点信息
ArcNode * firstArc; //指向边表的第一个元素,(哪个是第一个邻接的边?都可)
}VNode,AdjList[Maxsize];
3.万事俱备,只欠临门一脚
typedef struct{
AdjList[Maxsize]; //每一个点都扯出来一条单链表,全部顶点扯出来,就能完整的表达一个图
int vexnum,arcnum; //点数和边数
}ALGraph;
分析一波特性:(对照着邻接矩阵
1.空间复杂度&