C++ 最小生成树(优先队列)

这篇博客介绍了如何使用C++实现最小生成树的算法,包括通过优先队列处理边的权值以及应用Kruskal算法。文中详细解释了Kruskal算法的思路,强调其基于贪心策略和运行时间为O(nlogn)。同时,讨论了并查集在算法中的作用,用于维护连通分量,并提供了find函数的递归实现。
摘要由CSDN通过智能技术生成

例题:
这里写图片描述

使用最小优先队列将边的权值进队;然后依次出队列。
并且用一个一维数据记录节点的父节点,出队列的同时判断两个点的父节点是否相同,同则不用,不同则可以用。判断是不是树的时候,可以根据根节点判断,因为每个节点中存储的父节点都会间接指向根节点。

Kruskal算法

Kruskal算法也是采用贪心算法的思想,运行时间为O(nlogn)。
算法描述

设R是有n个顶点的对称连通关系。S={e1,e2,e3…..ek}是R的加权边集合。

1)在S中选择最小权的边e1,设E = {e1} 用S- {e1}取代S。
2)在S中选最小权的边ei,并且不与E中的元素形成回路。用E∪{ei}代替E,并用S- {ei}取代S。
3)重复步骤知道|E|=n-1.

代码设计

1、利用优先级队列将权值小的边放到队列最前,优先出对,保证了每次选择的都是权值最小的边。

2、利用并查集的查找及结合把同处同一连通分量中的顶点连到同一父节点下。这样,每次判断是否构成回路,只要判断父节点是否相同的即可。

并查集

我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值