一:最小生成树
最小生成树指的是对于一个带权连通无向图而言,生成树不同,则其权值不同(树中边上的权值之和)。若这课树中边上的权值之和最小,那么就称这课树为最小生成树。
最小生成树的性质
最小生成树并不唯一(树形不唯一)。
注:当图G中的各边权值互不相等时,G的最小生成树是唯一存在的,但是最小生成树的权值唯一(且是最小)。
最小生成树的算法
最小生成树的算法主要有Prim算法以及Kruskal算法(均基于贪心算法)
首先介绍Prim算法
可以简记为通过点来求解,主要有三个步骤
- 找距离最短的点
- 连接节点
- 重复上述步骤
上图为prim算法构造最小生成树过程
prim算法的时间复杂度为O(|V|^2),不依赖边,适合求解边稠密的图的最小生成树。
Kruskal算法
简记为通过边来求解,也是三步
- 找最短边
- 连接节点
- 重复上述步骤
上图为kruskal算法构造最小生成树过程
在kruskal算法中,采用堆来存放边的集合,姑每次选择最小权值的边只需要O(log2|E|)的时间,构造整个生成树的时间复杂度为O(|E|log2|E|),此算法适合于边稀疏而定点多的图。
注意:两种算法在构造树的过程中均不能形成闭环(回路)。
二:最短路径
定义:带权路径长度最短的那条路径称为最短路径。
最短路径的求法:
- 经典的Dijkstra(迪杰斯特拉)算法
- Floyd(弗洛伊德)算法
直接上图较为清晰
书上步骤比较繁琐,下面我将根据我个人的理解来讲解下。
首先画一个表格将定点数值写在纵坐标一栏,横坐标写的是经过查找最小路径的次数(轮数);从顶点出发依次找其到各个定点的距离(权值),能直接相连的就直接写边上的数值,也就是权值,如果不能直接相连的就代表其不能直接抵达,先写∞,然后从中找出最小的路径长度,将其视为下一轮的路径标准,重复此步骤,直到找完所有经过的最短路径。
至于Floyd算法和后续的拓扑排序以及关键路径的求解下一次再做总结,这节先讲到这里。
注:如有讲的不好,还请多多指教,期待交流探讨!