[小结论]生成树

1、问题:对一个图,要求某一个生成树,使得该生成树第k大的边最小。(来源于POJ 2349)

结论:对图做一遍最小生成树,所求边即为最小生成树中第k大的边。

证法:考虑求MST的Kruskal算法。

  在使用Kruskal求MST的过程中,从小权边到大权边遍历所有边,遍历到每一条边的时候检查一下若将它加入生成树是否会形成环,若不形成则将它加入生成树,这样遍历完所有边之后就能求出最小生成树。

  若存在一个生成树T',其第k大的边比MST(记为T)中第k大的边权值小。记T'中第k大的边为l1,T中第k大的边为l2。图中所有边按小到大排序为a1,a2...am。不妨设l1为ai,l2为aj,则i < j。设遍历到ai的时候,T'的边集为为A',T的边集为A,则由Kruskal算法的步骤可知,|A'| <= |A|,否则一定会出现环。因为,边集A不要某条边的原因就是要了它会形成环,所以如果向A中加一条边就一定要删一条边才可能维持它是森林,所以|A'| <= |A|。

  这样的话,若l1为T'中第k大的边,则l2至少为T中第(k+1)大的边,矛盾。  

 

2、在最小生成树中加入一条新边(边的两个顶点都在最小生成树中),一定会形成一个环。如果把环上的最长边去掉,就可以得到新的最小生成树。

posted @ 2013-12-02 23:35  Plumrain  阅读(201)  评论(0编辑  收藏  举报