最小生成树
Prim 算法
初始:从顶点集任意选择一个顶点加入集合U和T中开始;其中集合U记录已经遍历过的顶点;建立一棵树T,算法运行完后最终树T就是一棵最小生成树
循环:从遍历顶点发出的边中选择一条边。(这里很重要,算法是从当前顶点到达其他顶点的边选择的)
这条边有以下3个条件:
(1)权值最小
(2)发出这条边的顶点必须是属于U的(即属于遍历过的)
(3)这条边不属于T中 (即还没有被加入生成树中)
并将选择的边加入T中,及其到达的顶点也加入U和T中
结束:当所有顶点都加入到T中
分析:算法遍历每一个顶点以及该顶点到其余顶点的边O(|v|^2)
Kruskal 算法
初始:从最小权值的边开始;集合E记录所有未被加入T的边;建立一棵树T仅包含所有顶点(意义同上)
循环:从未被加入T中的边中选择一条边。
这条边有以下3个条件:
(1)权值最小
(2)此边不能构成回路
(3)这条边不属于T中
并将选择的边加入T中,更新E
结束:已经加入了N-1条边到T中
分析:算法每次遍历一条最小权值的边,采用堆结构存储时间复杂度能达到O(eloge)
Dijkstra算法
初始:从源点开始作为当前顶点,定义一个数组A记录从源点到其他顶点的最短路径初始化∞无穷(即不可到达),定义一个集合B初始化为{V0}记录已遍历的结点
循环:对于当前顶点V,(若小于当前记录的最短路径) 则更新V到其他顶点路径长度
再从数组A选择一条val值最小的顶点(即到源点V0最短的顶点),并把这个顶点作为当前顶点V,进入下一个循环
结束:当所有顶点遍历完,即B包含所有结点后结束
注意:对于遍历过的顶点,也即相当于 已经求得到达该顶点的最短路径
Floyd算法
原理:遍历每一个顶点作为中转站
初始:初始时和图邻接矩阵状态一样(每一个元素相同)若没有中转站 path的值就是路径权值
循环:算法是一个三重循环
最外层循环:对于每一个当前顶点Vk,将V作为中转站
内部两层循环:遍历整个图的i和j
对于如果 条件 V[i][j] > V[i][k] + V[k][j] //也就是i通过k到达j的路径长度更短
则更新V[i][j]为更小值
且更新path[i][j] = path[k][j] 记录中转站是k
结束:所有顶点遍历完