提高篇-图论-《算法笔记》同步笔记总结与补充

专题要点:

  • 点权和边权:顶点和边均可具有权值,根据题意判断。邻接矩阵:边的权值可以存入矩阵中,点的权值需要另存储在一位数组中;邻接表:点权边权都可以用结构体存储
  • 图的遍历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算法的区别:见上文算法比较

你可能感兴趣的:(算法笔记)