光棍节系列之最小生成树之prim

前段时间有写最小生成树,然后又写了几天的最短路径。


近日,光棍节。。。光棍啊。。。所谓最小生成树就是不能成双成对,只有最小,


今天POJ1258

联通n个farm,i到j和j到i相同,无向图,并且,各个点之间的权重已知。求最小数的权重之和。


首先建立一个数组low【i】用于储存找到的最小值,然后再用一个布尔数组做标兵,表示此点和之前已搜过。

随机选一点,从1开始即可。用一个point表示下一个到达的点。

注意体重忽视自身到自身,不考虑环。

先看例子。

首先,1-2,1-3,1-4,选最小的。找到后,point指向下一个最小的点,此时,point=2.,low[1] = 4,2点对应的布尔值为true

再次,2-3.2-4,选最小的,point指向3,low[2] = 8,3点对应为true

最后,3-4,point = 4,low[3] = 16.4点对应为true

因为布尔数组全部为true,表示找完。


so,done。


注意算法导论中的关于引出prime的一个定理


Let T be MST of G = (V,E),let A is in V,suppose (u,v ) ∈ E,is least - weight edge connecting A to V-A,then ( u, v) ∈T.

证明的时候用矛盾法,如果最短的都不在T中,那么T就不是最小树,还存在比T更小的树。


所以,所谓prime,就是依次找出最短的,注意时间复杂度比较复杂。

设Q为优先队列,因为要从Q中取出最小的权重,则Q的表现形式影响到最终复杂度。

Q可以表示为数组,二叉树,Fib-堆

另外赋最小值到对应的数据结构也影响着最终复杂度。比如,赋最小值到数组复杂度为O1,而到二叉堆则为lgV。要注意。

Time = V * T1 +E* T2

注意T1为取出Q中的最小值,T2为降低key值操作。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值