最小生成树

1.概念

最小生成树针对的对象是无向连通帯权图,目的是生成一棵总权重最小的连通图,因为最小的连通图一定是树,那么实际上找到的一定是一棵最小权重的树,称之为最小生成树。

2.算法标签

贪心,根据贪心策略的不同,当贪心的是边的时候,为Kruskal算法,当贪心的是点的时候,为Prim算法

3.最小生成树的形成

  • 安全边的概念
    最小生成树肯定存在,有可能不止一棵,若A是某一棵最小生成树的子集,如果加入一条边(u,v)之后,A’=A+(u,v)仍然是某一棵最小生成树的子集,则认为边(u,v)是安全边。
  • 轻边的概念
    轻是最小权值的意思,对于一个无向有权图G=(V, E),对于图G的一个割(S,V-S),在穿过割的所有边中选取权值最小的边,称之为“轻边”
  • 不妨害的概念
    若边集A中的每一条边都不穿过割,认为割(S,V-S)不妨害A
  • 安全边规则
    若G = (V, E )是一个无向带权连通图,设A是E的一个子集,且它是某棵最小生成树的子集,对于图的一个不妨害A的分割(S,V-S),它的轻边就是对集合A来说安全的,这个可以用剪切-粘贴方法证明,实际上就是反证法。
  • 最小生成树性质
    若G = (V,E)是一个无向带权连通图,A是某棵最小生成树的一个子集,因此GA(V,A)是一个森林,设C(Vc,Ec)是这个森林的一个连通子集,那么该连通子集到森林中其他分支的轻边对于A来说就是安全的,这个是最小生成树两个贪心算法的理论基础。

4.Prim算法与Kruskal算法

二者本质上都是利用上述最小生成树性质进行的贪心操作,具体二者的步骤在这个博客里面讲的很清楚,我只讲这两者的区别:

  • Prim算法每次选取一条安全边,选取的安全边加入到已选取的边集之中,这些边集构成了一个完整的连通图,而不是森林,当所有顶点都被加入时,算法结束
  • Kruskal也是每次选取一条安全边,但是在最小生成树生成之前,选到的边集可能构成的只是一个个连通图构成的森林而已,当只剩下一个连通图时,算法结束

5.代码实现

网上有好多代码。

posted @ 2013-10-01 23:31  曾见绝美的阳光  阅读(713)  评论(0编辑  收藏  举报