无向图之最小生成树—Prim算法和Kruskal算法图文详解HDU1863

本文详细介绍了Prim算法和Kruskal算法,用于解决加权无向图的最小生成树问题。Prim算法从任意点出发,逐步扩展至所有点,每次选择与树距离最短的边;Kruskal算法则按边权重从小到大排序,避免形成环路。两种算法在实际应用中各有优劣,Prim在特定条件下空间效率更高,Kruskal通常具有更好的时间复杂度。
摘要由CSDN通过智能技术生成

学习算法的最好方式,我认为是应从思考一些有趣的题目开始。学习一个算法之前要知道这个算法的价值是什么。

附题:HDU 1863 最小生成树模板题 

题目大意:询问你在各个村庄之间修公路,最少的花费是多少。

我们可以把“村庄"抽象成一个一个点,把”修公路的费用"抽象成连接两点的边值(权重)。

我们要求解决的是求出 把这些点(村庄)都连起来(修公路)时的所构成的树的权重总和最少(最少费用)是多少,即最小生成树的权重和。

如图:

注:生成树不含环路,且在有相同权重得情况下最小生成树可能不止一颗,但权重和一定相同。

 

则如何构建最小生成树成为重中之重!

下面介绍两种算法:Prim算法 和 Kruskal算法。

算法原理先介绍,证明会放在最后,因为这两种算法简单且看上去就像是那么回事~

 

 

 

Prim算法:

Prim算法的思想是:取图中任意一点作为起点放入树中,并向邻近树的点不断延伸,每次延伸的点要求满足到树的距离最短。

我们采用dis[]记录点离树的距离,并采用val[]标记在树中的点,两数组实时更新。

如图:

1:

2:

3:

4:

5:

这里省略一步连接点四的图,所以布置共6步,对应的图中6个点。

所以你知道所构建的最小生成树的权重和是多少吗?没错就是把每幅图中dis[]中红色数字加起来即可,即对应上面的图MinDis=2+4+5+3+7=21。其实dis[]不用在每步更新在树中的点,而是保留下来,这样最后遍历加一遍dis[]也可以得到答案(前提是所以点都可以连成一棵树)。

很可惜C++中没有

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值