您的位置:首页 > 其它

关于最小生成树算法原理的一点思考

2018-11-07 15:38 120 查看
版权声明:原创不易,转载须经作者同意 https://blog.csdn.net/zhichaosong/article/details/83825114

学最小生成树的时候一直有很多疑问:
比如克鲁斯卡尔算法:为啥不能有回路?为啥从最小的边开始找?
比如普利姆算法:随意选起点不会影响结果么?起点选的那条最短边就一定是最小树上的?

一、克鲁斯卡尔算法思考

1. 为啥不能有回路?

  • 原因1:如果有回路那边就是N条了,而不是N-1了,那为啥是N-1呢?因为一个边能连两个定点,N个定点不留孤岛肯定是N-1条边连起来;
  • 原因2:假设回路构成的路径总和最短,那我们去掉回路中一条最长的,那剩下的是不更短?而且其余顶点还保持连通?所以有回路一定不是最短;

2. 为啥从最小的边开始找?

因为克鲁斯卡尔就是以边为核心,目的就是从小到大选N-1条最短的边,这样构成的路径肯定也是最短的(当然构成回路的边不能去选);

二、普利姆算法思考

1. 随意选择起点会影响结果么?

选择起点时,我们假设其余的定点都已经连通了(因为他们迟早要连通的),那我们现在随意算的起点,再选一个最短路径是不就已经是整个图的最优选择了呢?

2. 起点选的那条最短边就一定是最小树上的?

同上

三、概念回顾

1. 树(Tree)

如果一个无向连通图中不存在回路,则这种图称为树。

2. 生成树 (Spanning Tree)

无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。
生成树是连通图的极小连通子图。这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路;若去掉一条边,将会使之变成非连通图。

3. 最小生成树(Minimum Spanning Tree,MST)

或者称为最小代价树Minimum-cost Spanning Tree:对无向连通图的生成树,各边的权值总和称为生成树的权,权最小的生成树称为最小生成树。

构成生成树的准则有三条:
<1> 必须只使用该网络中的边来构造最小生成树。
<2> 必须使用且仅使用n-1条边来连接网络中的n个顶点
<3> 不能使用产生回路的边。

构造最小生成树的算法主要有:克鲁斯卡尔(Kruskal)算法和普利姆(Prim)算法他们都遵循以上准则。

4. 克鲁斯卡尔(Kruskal)算法

根据边的加权值以递增的方式,一次找出加权值最低的边来构建最小生成树,而且规定:每次添加的边不能造成生成树有回路,知道找到N-1个边为止。

5. 普利姆(Prims)算法

以每次加入一个的临界边来建立最小生成树,直到找到N-1个边为止。其规则为:以开始时生成树的集合(集合U)为起始的定点,然后找出与生成树集合邻接的边(集合V)中,加权值最小的边来建立生成树,为了确定新加入的边不会造成回路,所以每一个新加入的边,只允许有一个顶点在生成树集合中,重复执行此步骤,直到找到N-1个边为止。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: