最小生成树c++

定义:

简单概述:一个有 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操作),再进行下一轮操作。

抽象一点地说,维护一堆 集合,查询两个元素是否属于同一集合,合并两个集合。

其中,查询两点是否连通和连接两点可以使用并查集维护。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值