前段时间有写最小生成树,然后又写了几天的最短路径。
近日,光棍节。。。光棍啊。。。所谓最小生成树就是不能成双成对,只有最小,
今天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值操作。