zoukankan      html  css  js  c++  java
  • 最小生成树

    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.代码实现

    网上有好多代码。

  • 相关阅读:
    双主双写、只备份某些表且要在建表ID自增
    我的系统资源呢?php-fpm你知道吗?
    apache常用的两种工作模式 prefork和worker
    Binlog的三种模式
    Tomcat
    JVM初识、调优
    httpclient 3.1跳过https请求SSL的验证
    POM报错Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from
    eclipse快捷键,移动和复制一段代码
    org.codehaus.jettison.json.JSONObject使用方法
  • 原文地址:https://www.cnblogs.com/obama/p/3348919.html
Copyright © 2011-2022 走看看