prim算法以及kruskal算法,原生问题中是求解将n个节点连接并花费最小而形成的树的算法。还可以求解最大的边权最小的问题。
相关题目后续补充
总是链接离中心最近的一个节点到树中。
O(n ^ 2)
反证法:将当前与外界直接相连的权值最小的一条边不并入树中,而是通过其他点将两个连通块连接构成了一棵树。在树构成完成之后,将该边并入树中,根据树的性质可以得到一个环,由于一开始两个连通块并不连通,一定是通过一条比该边权值更大的边进行连通的,所以该环一定会出现比该边权值更大的边,于是可以将环中权值最大的边去掉,仍然可以得到一棵树并且整棵树权值不会减小,于是得证该边一定可以并入该最小生成树中。
连通性:将树与外界分开,将外界所有节点视为已经连通的连通块,如果最后要构成一棵树的话,显然需要一条边将“树”和“外界”进行连通。那么最优解显然就是权值最小的那一条边。
类似于Bellman-Ford算法,去中心化,最终得到一棵树。直接存储边的结构体实现。
O(ElogE)
,如果不用排序可以优化到O(E)
计算中的任意过程拿出来都是正确的,可以中途结束,同样可以中途开始。是一个逐渐连接各个连通块,逐渐减少连通块个数的方法,因此可以可以求解类似最小生成森林的问题。
关键词:连通块,最小边。
- 虚拟原点:可以完成点权转换为边权,将一些特殊的东西一般化。
- 最小边:Kurskal算法的灵活应用需要关注算法过程中的连通块和最小边,这是一个很重要的性质。
- 次小生成树:最小生成树的一类问题,最小生成树的邻集。
定义:第二小的生成树,不严格的话可以等于最小生成树,严格的话一定小于最小生成树。
求解方法:
O(mlogm + m)
O(m + n^2 + mlogm)
,如果使用LCA倍增优化,可以达到O(mlogm)
原文:https://www.cnblogs.com/TanJI-life/p/15125807.html