定义:
简单概述:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。——百度百科。
在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集且为无循环图,使得联通所有结点的的 w(T) 最小,则此 T 为 G 的最小生成树。
最小生成树其实是最小权重生成树的简称。
说人话:其实就是在一张图上,找一个最小边权和的树
举个栗子:如下图所示,左边的树为右边的图的最小生成树
attention:只有连通图才有生成树,而对于非连通图,只存在生成森林。
前置知识:
并查集,图的存储,图的相关概念,贪心,dp思想
Kruskal 算法:
过程:
将所有边权进行排序存,每次选取一个边权最低且两端顶点没有被连通的边,因为连通的已经生成了树(并查集find操作),将这条边的两个顶点连起来(并查集union操作),再进行下一轮操作。
抽象一点地说,维护一堆 集合,查询两个元素是否属于同一集合,合并两个集合。
其中,查询两点是否连通和连接两点可以使用并查集维护。