【数据结构】图_复习笔记总结
一、基本定义与性质
图由两个集合 V 和 E 组成,记为 G = (V,E), V 是顶点集,E 是边集
- 有向图: 顶点对
有序,意为一条由点 x 指向点 y 的有向边。 和 是不同的两条边 - 在
中,x 是始点 / 弧尾,y 是终点 / 弧头
- 在
- 无向图: 顶点对(x, y) 无序,(x, y) 和 (y, x) 指的是同一条
基本术语
n 表示顶点数,e 表示边数
- 子图: 有一个图的顶点全部都是另一个图的顶点,边也全都是另一个图的边,这个图叫做另一个图的子图
- 完全图
- 无向完全图: 有 n(n - 1) / 2 条边的无向图,说人话就是每两个顶点之间都有边
- 有向完全图: 有 n(n - 1) 条边的有向图,说人话就是从任何一个顶点都能到任何一个其他顶点
- 稀疏图和稠密图: 边少的就是稀疏图,边多的就是稠密图
- 网: 带权图
- 邻接点: 无向图中,(v, v’) 表示 v 与 v’ 互为邻接点,v 和 v’ 相邻接,边 (v, v’) 依附于顶点 v 和 v’,边 (v, v’) 和顶点 v v’ 相关联
- 度: 和顶点相关联的边的个数,记作TD(v)
- 入度: 有向图中从该点发出的边的个数,记作ID(v)
- 出度: 有向图中从该点进入的边的个数,记作OD(v)
- TD(v) = ID(v) + OD(v)
- 度是边数的两倍
- 路径长度: 一条路径上边的个数
- 回路 / 环: 起点终点相同
- 简单路径: 顶点不重复的路径
- 简单回路 / 简单环: 起点终点相同,其他不出现重复顶点的回路
- 连通: v 可以到达 v’,则称这两点连通
- 连通图: 图中任意两点连通
- 连通分量: 无向图中极大连通子图
- 强连通图: 有向图中,从任意一个点可以到任意另一个点
- 强连通分量: 有向图中极大强连通子图
- 连通图的生成树: 含有图中全部顶点,但是边数减1,任意添加一条边,必定构成环
- 有向树: 一个顶点入度为0,其余顶点入度为1
二、图的存储
1. 邻接矩阵
二维数组,G[i][j] 代表 i 和 j 点的边情况
- 无向图中,G[i][j] = 1说明有边,G[i][j] = 0说明无边
- 有向图中,G[i][j] = w说明有边,权值是w,G[i][j] = ∞说明无边
|
2. 邻接表
链式存储结构,分为表头结点表和边表
- 表头结点表:包含数据和指针,数据表示存的是哪个顶点,指针指向这个顶点相邻的边表集
- 边表:包含数据,邻接点,指针,数据存储权值,邻接点存储是哪个点和本表的顶点相邻,指针指向下一个和顶点相邻的结点
|
3. 十字链表
个人觉得可以理解为有向图的邻接矩阵按邻接表的方式存储
看图自己理解吧~感觉考到的概率不大
4. 邻接矩阵和邻接表存储的比较
(1) 邻接矩阵
- 优点:方便
- 缺点:图稍微大一点就存不下
(2) 邻接表
- 优点:可以存下大图
- 缺点:麻烦,相对来说没有邻接矩阵直观(其实是本菜狗太弱了)
三、图的遍历
1. 深度优先搜索 DFS
(1) 思路
不撞南墙不回头,只要有没有走过的点就接着走,一条路走到底,直到不能走了就退回来,找到下一条能走的路
举个栗子
深搜的结果是:v1 -> v2 -> v4 -> v8 -> v5 -> v3 -> v6 -> v7
(2) 算法实现
邻接矩阵存储图
时间复杂度: O(V^2^)
void DFS_AM(AMGraph G, int v) |
邻接表存储图
时间复杂度: O(V + E)
void DFS_AL(ALGraph G, int v) |
2. 广度优先搜索 BFS
(1) 思路
知道起点之后,第一次遍历起点,第二次遍历所有与起点距离为1的点,第三次遍历所有与起点距离为2的点,以此类推~
举个栗子
还是这个图
广搜的结果是:v1 -> v2 -> v3 -> v4 -> v5 -> v6 -> v7 -> v8
(2) 算法实现
邻接矩阵存储图
时间复杂度: O(V^2^)
void BFS_AM(Graph_AM G, int v) |
邻接表存储图
时间复杂度: O(V + E)
void BFS_AL(Graph_AL G, int v) |
四、图的应用
1. 最小生成树
在一个连通网的所有生成树里权值之和最小的就是最小生成树。
(1) 普里姆 (Prim)算法
A. 思路
从起点开始,每次循环中遍历所有点,选择还没有加入最小生成树且与生成树集合距离最短的点加入生成树,直到所有点都加入生成树中
B. 算法实现
挖坑~
(2) 克鲁斯卡尔(Kruskal)算法
A. 思路
把所有边的权值按照从小到大排序,每次选择当前最小的,如果这条边连接的两个顶点有至少一个没有遍历过,就把这条边加入生成树,直到所有顶点都在生成树里
B. 算法实现
继续挖坑~
2. 关键路径
(1) AOE网
AOE网——带权有向无环图
- 边:活动
- 顶点:事件
- 权值:活动持续的时间
基本概念
- 源点: 入度为0的点
- 汇点: 出度为0的点
- 带权路径长度: 一条路径上各边权值之和
- 关键路径: 从源点到汇点带权路径长度最大的路径
- 关键活动: 关键路径上的活动
- 事件 v~i~ 最早发生时间 ve(i)
从源点到 v~i~ 的最长路径长度
ve(0) = 0
ve(i) = max{ve(k) + w~k,i~} - 事件 v~i~ 最迟发生时间 vl(i)
不延误任何后继事件的最迟发生时间
vl(i) = min{vl(k) - w~i,k~} - 活动 a~i~ =
最早开始时间 e(i)
等于事件 v~j~ 的最早发生时间
e(i) = ve(i) - 活动 a~i~ =
最晚开始时间 l(i)
等于事件 v~k~ 的最迟发生时间减活动持续时间
l(i) = vl(k) - w~i,k~ - ==当一个活动的最早发生时间等于最晚发生时间,那么说明这个活动是关键活动==
(3) 关键路径
A. 思路
没有思路,找到最长的一条路径,然后凭直觉做吧B. 算法实现
再挖一个
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Texcavator 的秘密基地!
评论