1 图的定义
1)各种图定义
2)图的顶点与边间关系
3)连通图相关术语
4)图的定义与术语总结
2 图的抽象数据类型
3 图的存储结构
1)邻接矩阵
时间复杂度O(n)。
2)邻接表
3)十字链表
4)邻接多重表
5)边集数组
4 图的遍历
1)深度优先遍历
2)广度优先遍历
5 图的最小生成树
通过前面的学习,对于含有 n 个顶点的连通图来说可能包含有多种生成树,例如图 1 所示:
普利姆算法(Prim):
先选中一个结点为一个整体,在剩下所有结点与该整体的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,然后在新合成的整体与剩下的所有结点的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,以此类推,直到所有结点遍历完。(以结点为目标构建最小生成树,适合边数多的稠密图)
【步骤】
(1)从图中选取一个节点作为起始节点(也是树的根节点),标记为已达;初始化所有未达节点到树的距离为到根节点的距离;
(2)从剩余未达节点中选取到树距离最短的节点i,标记为已达;更新未达节点到树的距离(如果节点到节点i的距离小于现距离,则更新);
(3)重复步骤2直到所有n个节点均为已达。
克鲁斯卡尔算法(Kruskal):
在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。(以边为目标构建最小生成树,适合边数少的稀疏图)
【步骤】
(1)将所有边的边权从小到大依次排列,并且均标为未选;
(2)选择最小的未选边;
(3)如果该边与前面所选的边无法构成回路,则选中该边,并标为已选;如果该边与前面所选的边构成了回路,则不选该边,并标为已选;
(4)重复(2)(3),直到所有点之间都有边相连;
6 最短路径
迪杰斯特拉算法(Dijkstra):
迪杰斯特拉最最朴素的思想就是按长度递增的次序产生最短路径。即每次对所有可见点的路径长度进行排序后,选择一条最短的路径,这条路径就是对应顶点到源点的最短路径。
迪杰斯特拉算法总共就干了两件事:
【1】不断运行广度优先算法找可见点,计算可见点到源点的距离长度
【2】从当前已知的路径中选择长度最短的将其顶点加入S作为确定找到的最短路径的顶点。
看完这段视频就可以清楚迪杰斯特拉算法的过程:迪杰斯特拉算法讲解。
弗洛伊德算法(Floyd):
https://www.cnblogs.com/ssyfj/p/9495960.html
········
7 拓扑排序
1)拓扑排序介绍
2)拓扑排序算法
8 关键路径
1)关键路径算法原理
2)关键路径算法
9 总结