• 最小生成树(Prim算法、Kruskal算法)


    1、最小生成树(MST)

      a、连通图生成树包含所有的顶点,并且含尽可能少的边。权值之和最小的生成树称为最小生成树。

      b、生成最小生成树的算法主要有Prim算法和Kruskal算法,基于贪心算法的策略。

      c、生成的最小生成树不一定唯一各边权值不相同时,最小生成树唯一。    

                

    2、Prim(普里姆)算法

      a、Prim算法适合稠密图(边相对于结点更多)

      b、初始化是一个结点。

      c、原理:

      相当于把所有结点分为两大类顶点集U(已经确定的结点)和V(未被确定的结点),U和V之间有边相连,每次找这些边中最小权值的边,将该边对应的V中的结点再添加到U中,继续重复操作,直到全部结点都为U中的结点。最小生成树构建完成。Prim算法的生成树不唯一(每次选择最小边的时候,可能存在多条同样权值的边可选,此时任意选其一就可以)。

      d、因为时间复杂度只和结点数V有关,所以适合稠密图。时间复杂度是O(|V|2

    3、Kruskal(克鲁斯卡尔)算法

      a、Kruskal算法适合稀疏图(结点相对于边更多)

      b、初始化是把所有结点加入到顶点集中,根据要求挑选下一条边。

      c、原理:

        相当于把所有边按照从小到大顺序排好,依次从中抽取出最小权值的边,如果添加一个边之后,这个边和已经确定的边形成了回路,则将这个边舍弃,因为不满足最小生成树的要求。直到最后形成n-1条边(n是总结点数),则构建完成。

        其中判断是否构成回路利用到了并查集,排序用到Sort()函数

        

      d、时间复杂度只与边有关,所以适合稀疏图。

         其中边数是|E|,因为算法中用到了堆排序,堆排序的时间复杂度是Log|E|,所以总的时间复杂度是O(|E|log|E|)。

      

  • 相关阅读:
    00037_this关键字
    一些Perl例程(全部手打并执行过)
    告别码农生涯
    转载:直面人生的大实话
    iOS sqlite C语言操作
    linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数
    iWatch应用开发-oc篇
    Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结
    (二)用控制器controller给模型数据赋初始值
    PhoneGap开发的android项目环境搭建简单流程
  • 原文地址:https://www.cnblogs.com/oaoa/p/13748751.html
Copyright © 2020-2023  润新知