图
- 有向、无向
- 有权、无权
邻接矩阵
- 本质是二维数组 arr.cpp
- 优点:判断两点相连快 \ 缺点:稀疏图浪费空间,求一点的度要遍历一行
- floyd算法 floyd.cpp
1.时间复杂度O(n3),处理数据规模小的问题
2. 核心公式 j --> k ( i 作为中转点)
3. 求任意点到任意点的最短路,无负边
邻接表
- 本质是二维数组,对临界矩阵的“空边”进行压缩
- 有权图的数组元素是node,用vector实现节省内存
- 优点:省空间,求某点的度不需要遍历所有点(邻接矩阵的缺点) \ 缺点:判断两点相连要遍历一行
- dijkstra算法 dijkstra.cpp -> 746.cpp
- 求单源到任意点的最短路,无负边
- 从起点出发到几个终点的权值,弹出起点,确定当前最小边的点(其他路径中转了非负边,更大),从新点出发遍历增加新的状态后再选择最优,直到弹出所有点,是贪心
链式前向星
- 本质是用数组模仿静态链表,head[ i ]记录以 i 为起点的第一条边(实际是最后一条边)的下标,edg[ head[ i ] ]中{e, v, next}的e为终点,v为权值,next为同起点的下(实际上是上)一条边的编号
- 邻接多重表类似
- 插入:像链表的头插法