您的位置:首页 > 其它

算法导论-最小生成树习题解

2012-04-04 11:57 471 查看

23.1-11 给定一个图G和一棵最小生成树T,假定减小了不在T中的某条边的权值。请给出一个算法,来寻找经过修改的图中的最小生成树。


  解:将这条修改了权值的边加入到T中,则T中形成环,找到这个环,然后删除环中权值最大的边。


  23.2-4 假设在某个图中,所有的边的权值都一致分布在半开区间[1, 0)之间。对于Kruskal 和Prim这两个算法,你可以让哪一个运行得更快些?


  解:可以让Kruskal 算法运行的更快些。由于权值均匀分布在[1,0)区间内,可以使用桶排序排序权值。这样Kruskal算法的时间复杂度为O(|E|a(|V|))。

    ps: 顺便说下Kruskal和Prim算法加速问题:如果权值处于[1, |V|]之间,排序可以用计数排序,这样时间Kruskal时间复杂度为O(|E|a(|V|))。(23.2-4)。

     由于Prim算法时间主要耗费在维护优先级队列的性质上,加速的方法是使用更加复杂的数据结构,比如基数堆,斐波那契堆。(23.2-5)


  23.2-7 假设某个图G有一棵已经计算出来的最小生成树。如果一个新的顶点及其关联的边被加入到了G中,该最小生成树可以在多块的时间内被更新呢?


  解:假设G的最小生成树为T,新加入的顶点为v,则图G+v的最小生成树就是T+v的最小生成树(这个命题可以由上题得出)。T+v的最小生成树可以在|V|lg|V|的时间内生成。


  23-1 次优最小生成树


  解:a) 略

    b) 1. 任何一棵生成树都可以由最小生成树替换k(1<= k <=v-1)条边得到。

     2. 替换k条边可以由先替换k-1条边形成一棵生成树,然后再替换一条边得到。因为如果前k-1次替换不能形成生成树,则必形成环,再替换一条边也不能形成生成树。

      3. 如果按照 |替换边的权 - 被替换边的权| 的大小递增来替换最小生成树的k条边,则替换k-1条边形成的生成树的权值必然小于替换k条边的生成树的权值。

      4. 从以上推论可知,次最小生成树可由替换一条边得到。

   c) 在最小生成树中进行深度优先遍历,max[u,v] = max{max[u,w], max[w,v]}。需要填满v*v大小的表格。时间复杂度为O(v^2)。

    d) 1. 计算最小生成树O(ElgV)。

     2. 在最小生成树中计算max[u, v], O(V^2)。

     3. 寻找满足 minimize{w[u,v] - max[u,v]} 的边(u,v), (x, y),用边(u,v)替换边(x, y),O(V^2)。


  23-2 稀疏图的最小生成树


  解:a) Kruskal算法

    b) 每收缩一条边,顶点数减1,MST-REDUCE过程至少收缩V/2条,因此|V(G')| <= |V|/2。

    c) 可以用DFS在O(E)时间内找到与所有顶点相连的最小权边,即在O(E)时间内找到需要收缩的边,UNION, FIND-SET的次数不超过3*E,使用按秩合并和路径压缩来实现并查集,可以在O(E)时间内操作,总时间为O(E)。

   d) 每个阶段的时间都为O(E),总时间O(kE)。

    e) 使用斐波那契实现Prim算法, 总体运行时间为(kE + V'lgV'),由于MST-REDUCE运行一次,顶点数至少减少一半,故k次后,V' <= ((1/2)^k)V。 当 k = lglgV时,总时间为O(ElglgV)。

    f) 此时有 ElglgV < VlgV,计算得 E < VlgV/(lglgV)。


  23-3 瓶颈生成树


  解:a) 假设最小生成树不是瓶颈树,设最小生成树T的最大权边为e,则存在一棵瓶颈树Tb,其所有的边的权值小于w(e)。删除T中的e,形成两棵数T', T'',用Tb中连接T', T''的边连接这两棵树,得到新的生成树,其权值小于T,与T是最小生成树矛盾。

    b) 删除所有权值大于b的边,然后DFS看图是否连通。

    c) 1. 取权重的中位数m。

      2. 利用c)中过程检查瓶颈生成树的值v与m关系。 如果v > m,则利用MST-REDUCE过程收缩所有权不大于m的边,然后对重新生成的图重复1, 2;如果v < m,删除权值大于m的边,重复1,2;如果 v = m,则可用添加边不形成环的方式找到瓶颈树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: