最小生成树

最小生成树

0x00 什么是最小生成树

:一定连通,且没有回路,v个顶点,一定有v-1条边

生成树:包含全部顶点,v-1条边都在图里,向生成树中任加一条边都一定构成回路

最小:边的权重和最小

​ 最小生成树(minimum spanning tree)存在<=>图连同

0x01 贪心算法

​ 每一步都选最好的解法

​ 1 只能用图里有的边

​ 2 正好用v-1

​ 3 不能形成回路

prim 算法QQ截图20200210124652

1dist初始化 如果节点与根节点直接相连就初始化为对应权重,否则为正无穷,被收录则距离为0

2如何存树,用静态链表(数组保存子或者父节点) 保存父节点

3当这样的v不存在时 有两种可能 一 节点全部收录 二 剩下的节点的dist都是正无穷(不连通),所以突出循环后要判断收录的节点数目

4 如果 未收录顶点的最小者 用遍历,则时间复杂度为O(V^2+E) 适合稠密图

Kruskal算法:将森林合并成树

初始状态下认为每个节点都是一棵树,然后不断选最小权重边将两棵树合并成一棵树,但是该边不得使原来的树产生回路(通过集合的运算,如果该边的两个顶点处于同一棵树,也就是在同一个集合,就是回路。所以一开始合并树的时候要合并对应集合)。

QQ截图20200210125934

按照图上 用最小堆和并查集,时间复杂度为O(eloge),适合稀疏图(相比较v^2+e)(e接近v,比v2快)