文章目录
最小生成树
总览
生成树
广度优先生成树
深度优先生成树
最小生成树
针对的是带权连通图
Prim算法
同一个图的最小生成树可能不唯一
从p城出发
从农场出发也一样
Kruskal算法
Prim vs Krusakal
Prim的实现
先找到最低代价的节点,每次将节点加入树后,需要更新各节点加入树的最低代价(即将原来的代价和个节点与加入节点的代价作比较)
Kruskal的实现
查找并查集(如果用二叉树实现的)的根需要log2E
小结
最短路径问题
单源最短路径问题
BFS求无权图的单源最短路径
首先访问2号顶点,然后再更新其相邻顶点后的结果
然后1号顶点出队,相邻节点入队,同时更新各相邻节点
然后6号顶点出队,更新相邻节点,同时各个相邻节点入队
5号顶点没有相邻
所以到3号顶点处理
7号顶点处理
4号和8号相邻节点都被访问,所以没有处理
小结
Dijkastra算法
BFS局限性(默认每条路径长度一样)
初始化后,即更新初始节点及其相邻节点
第一轮后
第二轮后
第三轮后
第四轮后
查找两个顶点的最短路径
算法时间复杂度
不适用情况
每一对顶点的最短路径问题
Floyd算法
初始时
允许在v0中转
允许在v0 v1中转
允许在v0 v1 v2中转
找两个点的最短路径
核心代码
空间复杂度是有n*n个矩阵那么多
实例
初始
允许在v0中转
发现没有变化
从图可以发现v0没有进去的边,所以自然没法中转
允许在v0 v1中转
允许在v0 v1 v2中转
是已经基于之前v0 v1的中转结果的
例如v2到v3是基于中转v1的,但是在以v2中转的转换中是把它认为是相连的
允许在v0 v1 v2 v3中转
允许在v0 v1 v2 v3 v4中转
找两个顶点最短路径
Floyd用于负权图
不能解决的问题
回路越多,路径越短
小结
BFS 采用邻接矩阵是V的平方 邻接矩阵是V+E