光棍节系列之最小生成树之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值操作。

点赞