定义
图由顶点集V和边集E组成
线性表和树都可以是空的,但图不可为空,但图的边集可以是空集
E是有向边/无向边决定图是有向图/无向图
AB为两端点。E的集合若是无向边,则E{(A,B)};若E的集合是有向边,则E{<A,B>}
度:无向图就是依附于顶点的边的条数(TD(V));有向图就是入度和出度和(TD(v)=ID(v)+OD(v))
在具有n个顶点,e条边的有向图中。ID和=OD和=e
路径、回路
简单路径:再路径序列中,顶点不重复出现的路径
简单回路、路径长度
点到点的距离:顶点间最短路径,若不存在该路径,则距离记为∞
无向图中,若顶点v和顶点w有路径存在,则称v和w是连通的
有向图中,若顶点v到w和顶点w到v之间都有路径,则称这两个顶点是强连通的
若G中任意两个顶点连通,就是连通图,否则为非连通图
若G中两两顶点强连通,就是强连通图
对于n个顶点的有向图G,若G是强连通图,则最少有n条边
子图:顶点和边都是原图子集的图
生成子图:包含原图所有顶点,可以去掉部分边
无向图中极大连通子图称作连通分量
有向图中极大强连通子图乘坐强连通分量
生成树:连通图的生成树是包含图中全部顶点的一个极小连通子图
生成森林:非连通图
边的权、带权图/网
特殊图
无向完全图、有向完全图、稀疏图、稠密图、树、森林
图的存储
邻接矩阵法:int型二维数组。1代表有边,0代表无边(注意区分有向和无向,有向1个1,无向2个1)
求度的时间复杂度O(|v|)。存储边的空间复杂度O(|v|)适合存储稠密图
带权图(网):0和∞代表无边,有边存边的值
𝐴n𝑖𝑗等于由顶点i到顶点j的长度为n的路径的数目
邻接表法:存顶点和这个顶点的指针。无向图空间复杂度O(|v|+2|E|)有向图O(|v|+|E|)
找出度很简单,找入度很麻烦
十字链表法(存储有向图)(空间复杂度O(|v|+|E|)
邻接多重表(存储无向图)(空间复杂度O(|v|+|E|)
图的基本操作
列出G中与结点x邻接的边:邻接矩阵O(|v|);邻接表出边O(1)-O(|v|)入边O(|E|)
图G中插入新的顶点x:邻接矩阵O(1);邻接表O(1)
删除顶点x:邻接矩阵O(|V|);邻接表O(1)-O(E)。
增加一条边:都是O(1)
图的广度优先遍历
无向图BFS调用函数次数=连通分量数
邻接矩阵存储的图:时间复杂度O(|v|2)
邻接表存储的图:时间复杂度O(|v|+|E|),若是无向图时间复杂度O(|E|)
图的深度优先遍历
空间复杂度:最坏Ov最好O1
时间复杂度O(|v|2)
最小生成树
prim算法:从某一个顶点开始构建生成树,每次纳入代价最小的顶点,直到纳入所有顶点
时间复杂度O(|v|2)。适合边稠密
kruskal算法:每次选择一条权值最小的边,使这条边的两头连通
时间复杂度O(|E|log2𝐸)。适合边稀疏
最短路径
单源最短路径:1、BFS算法(无权图);2、dijistra算法(带权图、无权图)
各顶点间的最短路径:Floyd算法(带权图、无权图)
先不学,如果刷到题再看,有点复杂
有向无环图(DAG图)
AOV网
拓扑排序
拟拓扑排序
从源点到汇点的多条有向路径,所有路径中,最大路径长度为关键路径
时间余量:最早开始时间和最迟开始时间的差值
代码构建图的一些助记
邻接矩阵:typedef struct{存顶点的数组,存边的二维数组,图的顶点和弧数}Mgraph;
插入点时直接插入;插入边/判定连通时,获取两点分别对应点数组的下标,把下标I,j带到边数组讨论
邻接表:
struct ArcNode{ajvex(弧指向顶点位置),ArcNode *next指向下一个弧的指针,(边权)}ArcNode | //边表结点结构体 |
Struct Vnode{data(数据),ArcNode *first指向第一条依附于该顶点的弧}Vnode,adjlist[] | //顶点表结点,也可看做数组 |
Struct{adjlist vertex邻接表,图的顶点和弧数}ALGraph | //总的存储类型 |