关于最小生成树算法原理的一点思考
学最小生成树的时候一直有很多疑问:
比如克鲁斯卡尔算法:为啥不能有回路?为啥从最小的边开始找?
比如普利姆算法:随意选起点不会影响结果么?起点选的那条最短边就一定是最小树上的?
一、克鲁斯卡尔算法思考
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个边为止。
阅读更多- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法
- 关于二叉树后续遍历算法的一点思考
- 关于算法的一点思考。。。
- 关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
- 关于最小生成树中的 Kruskal(克鲁斯卡尔)算法
- 关于最小生成树算法的理解
- 关于最小生成树的 prim 算法
- 算法心得2:关于k个最小和问题的思考
- 关于图ADT的一些算法——最小生成树算法(普利姆/Prim算法)
- 【解题报告】 HDU 1875 畅通工程再续 Kruskal最小生成树 一点关于浮点型在计算机中储存的分析
- 关于最小割问题的一点思考
- prim最小生成树算法原理
- 关于算法竞赛入门经典一书的思考学习——枚举排序和子集生成!
- 关于后台系统自动生成的一点思考
- 关于《GIS 点、线缓冲区生成算法的C#实现(V0.95)》的一点备注
- 关于Python中的del的一点思考
- 贪心算法 - 最小生成树 Kruskal算法
- 十大基础有用算法之迪杰斯特拉算法、最小生成树和搜索算法
- 最小生成树--算法案列(poj1251)
- POJ - 3241 Object Clustering(莫队算法/曼哈顿最小生成树)