邻接链表:稀疏图
邻接矩阵:稠密图

深度优先遍历:栈
广度优先遍历:队列
时间复杂度为Θ(V+E)
使用map实现邻接链表。使用set标记遍历过的节点。
https://github.com/EVANOMA/nonlinear-structure

拓扑排序:
例如课程的学习具有先后顺序,在修课程B前需要预修课程A。
图
图
需要用vector记录每个节点的入度(为0表示没有前驱节点)。使用队列作为容器进行保存入度为0的节点。(也可以直接pop_front每个list输出)开始遍历前通过erase删除入度不为0的list

最小生成树:当图的边有权值时,遍历所有节点的最小权路径。(由于不为环所以为树)

  • Kruskal(克鲁斯卡)和prim都是贪心算法
  • Kruskal:每次在图中寻找权值最小的边,且该边能够加入新顶点(可以2个都是新节点)
  • prim:每次在集合中寻找权值最小的边,且该边能够加入新顶点

单源最短路径:以图中某个节点作为源节点,计算出它到其他节点最短路径的长度。
图
- 无权:使用BFS或者DFS
- 有权:(权必须大于0,否则无法计算)
Dijkstra算法(贪心):
- 开始集合中只有源点,每次循环加入已确定最短路径的顶点。
- 对于没有加入该集合的顶点v,dis[v]为s到v的最短路径,且该路径只经过集合中的节点(类似于prim算法)
- 每次循环加入dis最小的顶点