专题要点:
- 点权和边权:顶点和边均可具有权值,根据题意判断。邻接矩阵:边的权值可以存入矩阵中,点的权值需要另存储在一位数组中;邻接表:点权边权都可以用结构体存储
- 图的遍历dfs,bfs:
- 遍历时,要对所有顶点进行搜索,防止出现图不连通的情况。
- 搜索的次数即为图中连通块的个数
- 最短路径问题:求源点到其他顶点的最短距离
传送门:提高篇-最短路径问题(图论)-《算法笔记》同步笔记总结与补充- Dijkstra算法:解决无负环的单源最短路问题
- Bellman-Ford算法:解决一般(含负环)的单源最短路问题
- SPFA算法:优化Bellman-Ford算法
- Floyd算法:解决全源最短路问题
- 暴力Dijkstra算法:解决全源最短路问题(对每个顶点做Dijkstra算法)
- 最小生成树问题:在无向图G中求出一棵包含G所有顶点和部分边(边权之和最小)的树型结构
- Prim算法:思想类似Dijkstra,解决稠密图
- Kruskal算法:解决稀疏图
- 拓扑排序:图结构(其为AOV图,DAG)中具有明确前后顺序的顶点的序列
- 入度是拓扑排序的关键:顶点入度为0,说明当前顶点是其他顶点的先导,排在其他顶点前
- 方法思想:输出入度为0的顶点,并不断调整与其相连其他顶点的入度
- AOE与关键路径:同为DAG有向无环图。相比于编程方法,这一节的概念内容容易理解的多(编程方法要绕晕了)
- 明确“事件”与“活动”:“活动:是指确确实实的行为,动作;事件:在AOE中并不是做了一件事情,而是说明一种状态(中介状态),即完成活动后,达到可以做下一件事情的状态,这才是事件的含义。
- 理解“最长”与“最短”:“关键路径是AOE中的最长路径,其长度却也是整个整个工程的最短完成时间。”
*最长:是从距离上讲的长短,路径长度最长;最短:是从时间上讲的早晚,项目结束的最早。既然关键路径不能拖延,则必然使项目结束最早
算法比较:
- Dijkstra算法:贪心法,对其他顶点与源点之间最短距离的贪心
- Floyd算法:O(N3),计算量小于暴力Dijkstra算法
- 暴力Dijkstra算法:O(N3)
- Prim算法:贪心法,类似Dijkstra,对其他顶点与已访问过的顶点集合S之间最短距离的贪心
- Kruskal算法:贪心法,对边权值(最小)贪心,使用并查集
可解问题:
在解图论有关题目时,一道题会涉及多种数据结构,多个数据存储容器或变量,需要做好注释,明确命名规范
- 图的遍历:根据搜索次数计算图中连通块的个数
PAT甲组1021 Deepest Root思路与注意点–补充《算法笔记》 - 最短路径问题:第一标尺选择最短路径,第二标尺选择花费小(边权),物资多(点权),平均值大(点权计算)等诸多实际问题
全网最全!PAT甲组1003.Emergency (优先队列实现迪杰斯特拉算法,Bellman算法,SPFA)思路与注意点–补充《算法笔记》
PAT甲组1072.Gas Station思路与注意点–补充《算法笔记》
PAT甲组1018.Public Bike Management思路与注意点–补充《算法笔记》 - 最小生成树问题:解决所有节点全部连通且代价最小的问题
- 拓扑排序:解决需要访问某个结点时,其前驱结点都已访问过
- AOE:关键路径,工程最早结束时间
几点注意:
- 首先要注意图中点和边虽然不同,却又息息相关:如点权边权,和删除点或删除边
- 遍历过程中需要删除边时:可以将权值改为0,-1等表示不存在的数值
- 遍历过程中需要删除点时:可以将与点有关的边全部修改为不存在,或是不必真的删除点,而是当访问到该点时跳过即可。
- 连通块个数:实际上就是集合个数,类比并查集;且对一个图进行搜索的次数即为该图的连通块个数
- 广搜:遍历时注意inq[]的标记位置,防止重复访问
- Kruskal是对边进行遍历的,因此边越少效率越高,即稀疏图
- 明确Prim与Dijkstra算法的区别:见上文算法比较