最小生成树(prim算法)

最小生成树在有N个顶点的图中包含N-1条边,通过不断选择A和B集合间的最小权边来逐步构建。算法从任意一个顶点开始,每次将与当前集合边权最小的未连接顶点加入到集合中,直至集合包含N个顶点。
摘要由CSDN通过智能技术生成
在实际生活中我们常常会遇到这样一些问题:有若干个需要连接的点(不妨假设为一些村庄)和若干条连接着两个点的边(在村庄间修公路),而这些边会有不同的权值(可设为修路所需的费用不同)。现在要连通这些所有的点,并使权值和最小。这类问题在现实生活中很广泛,如修公路、架设电网,等等。
在信息学竞赛中,这种问题有专门的称谓“最小生成树”(Minimum Spanning Tree,简称MST)。
今天介绍一下MST问题中的Prim算法。首先来看一道例题。
题目描述: 
Bessie受雇来到John的农场帮他们建立internet网络。农场有 N (2(= N (= 1, 000)牛棚,编号为1. . N. John之前已经勘测过,发现有 M (1<=m<= 20, 000) 条可能的连接线路,一条 线路是连接某两个牛棚的。 每条可能的线路都有一个建 设如C (1<= C <=100,000). John当然想花尽量少的钱,甚至克扣Bessie的 工资。 
Bessie发现了这点,很生气,决定给John捣乱。她要 选择)些线路组成网, 但费用却尽可能大。当然网络要能正常工作,也就是 任意两个牛棚之间都是相互 可以连通的,并且网络上不能有坏,不然John会很容易发现的。 
请计算组建这种网络最多可能的费用。 
输入文件cowtract. in 
第一行:两个整数N M 
下面M行:每行3个整数A, B, C。表示一个可能的线路要连接A、B两个牛棚, 费用是C。
输出文件cowtract.out 
只一行,一个整数,即花费最大的费用。如果不可能连接通所有牛棚,输出-1。 
输入样例:
5 8
1 2 3
1 3 7
2 3 10
2 4 4
2 5 8
3 4 6
3 5 2
4 5 17
输出样例:
42
注释:
17+8+10+7=42
通过题目中红色粗体字部分容易看出,本题是一道生成树问题。不过有点不同,是“最大生成树”。当然,算法一样。
现在,介绍一下Prim算法的思想。
  1. 首先我们可以确定,对于有N个顶点的图,MST一定只有N-1条边。如果有多余的边,显然会造成浪费。
  2. 将图分为两个集合A和B,设A就是我们要求的MST。其中A一开始只有一个任意的顶点。(整个图最终是连通的,因而该顶点最后必定在MST中,可取任意一点。)
  3. 每次取A和B的最小权交叉边e(即e=(x,y),x∈A且y∈B),将y加入A中。
  4. 当A中有N个顶点时,结束;否则转3。
举个例子:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值