最小生成树:Prim算法及python实现

最小生成树(MinimumSpanningTree)简称MST,是图论中的概念,通常用来计算连通图中的最短路径,是一种常见的路径优化方法。最小生成树看起来跟机器学习八竿子打不着,在各种参考书里也找不到任何关于它的描述。其实机器学习的目的从本质上来讲就是分类和优化,从这一点来看,两者还是有交叉的地方,将最小生成树引入到机器学习当中往往能起到意想不到的效果。

下面通过一个例子来一下什么是最小生成树。假设要在7个城市之间铺设通信光缆,不同的城市之间铺设光缆的代价各不相同,如何选择最佳铺设方案,在保证7个城市间能正常通信的基础上,使总花费最低?上图用字母A~G代表不同的城市,数字表示两个城市之间的铺设成本。上图中的绿色连线是计算得出的最佳方案,这种树形结构就是该问题的最小生成树。

Prim算法

寻找最小生成树的算法有很多,这里介绍最基础的Prim算法。该算法是通过反复地增加边来建立一棵树直到得到一个最小生成树。核心思想是建立两个集合mst和left,分别用于保存最小生成树节点和剩余节点,每次迭代从两个集合中各取一个节点,遍历所有可能组合的边的长度,将最短边对应的节点添加到集合mst中,直到集合left中节点的个数为0。Prim算法的步骤如下:

数据初始化:最小生成树节点集合mst={0},剩余节点集合left={1,2,3,4,5,6},边集合为空集;判断left是否为空,如果为空跳转第6步,如果不为空继续执行;双重for循环遍历mst和left,用表示节点P与的边长(P,分别是mst和left中的节点),寻找边长的最小值min();将最小值对应的加入mst,同时将从left中移除,并将边的信息存入(包括两个节点和边的长度);跳转到第2步;打印集合mst和边的集合。为了描述方便,我们在第1步数据初始化时,将节点0放入集合mst中,实际上,无论我们在第1步将哪个节点放入mst,都不会影响最后的结果。读者也可以修改下文的python代码自行验证。

python实现

在初始化的过程中非常重要的一步就是构建边长矩阵,本文的例子中共有7个节点,矩阵大小应该为7×7,该矩阵是一个主对角线元素为0的对称阵,第i行第j列的元素表示节点i与节点j之间的边长,如果两个节点之间没有边连接,则取值为-1。

核心代码如下图所示,逻辑结构很清楚,代码也非常简单。使用while循环判断结束条件;里面嵌套了双重for循环对mst_nodes和left_nodes进行遍历;寻找最小边,更新集合;最后打印出结果。代码在理解上没有任何难度,这里不再赘述。代码的获取方式见上图。

THE END
1.经典Prim算法题目及代码prim算法代码例题本文介绍了Prim算法在解决最小生成树问题中的应用,并提供了一道ACM竞赛中的经典题目。通过实例展示了如何利用Prim算法找到使所有节点联通的最短路径,并给出了完整的C语言代码实现。 摘要由CSDN通过智能技术生成 Prim算法是解决最小生成树的经典算法(尤以稠密图效率很高),现对这样一道简单最小生成 题目给出完整代码。https://blog.csdn.net/qq512028505/article/details/72628110
2.算法新解贪心算法4最小生成树(Prim算法)贪心算法4-最小生成树(Prim算法) 1.问题分析 在一个有n个节点的无向连通图G = (V, E)中,V表示顶点集,E表示边集。只需n-1条边就可以使这个图连通,n-1条边要想保证图连通,就必须不含回路,所以我们只需要找出n-1条权值最小且无回路的边即可。https://segmentfault.com/a/1190000021555887/
3.prim腾讯云开发者社区http://sjjg.js.zwu.edu.cn/SFXX/sf1/prim.html const int MAXN=110; const int INF=0x7fffffff; int n;//几个城市dist[i]表示i向外延伸的最短边长 int map[MAXN][MAXN];//储存a->b之间的边权https://cloud.tencent.com/developer/information/prim
4.Prim(普里姆)算法求最小生成树的思想及C语言实例讲解C语言Prim 算法思想: 从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止。 最小生成树(MST):权值最小的生成树。 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示https://m.jb51.net/article/87392.htm
5.Prim算法Python实现代码本文只对Prim算法进行实现,若需了解算法原理可参考文末链接。 importnumpyasnpimportrandom# 随机生成有权矩阵defgenerate_map(ver_num=6):graph=[]foriinrange(ver_num):raw=[]forjinrange(ver_num):ifi==j:raw.append(np.inf)else:raw.append(random.randint(1,31))graph.append(raw)print(graph)returnhttps://www.jianshu.com/p/5a3c3849c673
6.Prim算法知识点Prim算法:与Dijstra算法类似,具体操作是:从图中任意一个顶点开始,首先把这个顶点包括在MST里,然后在那些其一个端点已在MST里,另一个端点还不是MST里的边,找权最小的一条边,并把这条边和其不在MST里的那个端点包括进MST里。如此进行下去,每次往MST里加一个顶点和一条权最小的边,直到把所有的顶点都包括进MSThttp://jpk.pku.edu.cn/course/sjjg/chapter6/05/01.html
7.求解最小生成树Prim(普里姆)算法(2分钟极速掌握)深度优先(DFS)遍历(2分钟入门) 03:12 广度度优先(BFS)遍历(2分钟入门) 02:33 最小生成树(MST)定义 01:01 求解最小生成树-Prim(普里姆)算法(2分钟极速掌握) 02:01 求解最小生成树-kruskal(克鲁斯卡尔)算法--详解并查集 04:09 汉诺塔史上独创极简玩法-节奏法,浅入深出(栈代码实现) 06:23 求解https://www.bilibili.com/video/BV1D5411v7Po
8.算法之「普里姆(Prim)算法」普里姆算法(Prim'salgorithm)是图中普里姆算法(Prim's algorithm)是图中的一种算法,可在加权连通图中搜索最小生成树。 该算法的作用就是根据图中权值找到连接所有顶点的最短路径,也就是连接所有顶点的最小权值之和,也是这个加权图中的最小生成树。 普里姆算法步骤 1.选取权值最小边的其中一个顶点作为起始点。 https://juejin.cn/post/6844903830136569869
9.什么是最小生成树虾王之王的技术博客此时算法结束,我们找出了图中的最小生成树。 代码实现 // Prim算法生成最小生成树voidMiniSpanTree_Prim(MGraph G){intmin,i,j,k;intadjvex[MAXVEX];// 保存相关顶点下标intlowcost[MAXVEX];// 保存相关顶点间边的权值lowcost[0]=0;// V0作为最小生成树的根开始遍历,权值为0(0,3,*,*,*,4,*,*https://blog.51cto.com/tntxia/10861988
10.基于统计相关性与K[14];采用遗传算法避免冗余基因影响[1]等.近年来,采用特征聚类剔除冗余特征的研究得到关注.Wang等人[9]利用层次聚类,从每个类簇中选择一个到该簇其他基因距离最小的基因作为被选择基因.Song等人[13]利用特征间的相关性作权,构造带权无向完全图,采用Prim算法构造最小生成树,然后利用特征相关性[14]剪去部分边,https://www.jos.org.cn/html/2014/9/4644.htm
11.2012计算机考研大纲解析之数据结构要熟练掌握图的深度遍历和广度遍历算法,这是用图来解决应用问题时常用的算法基础。需要掌握基于图的多个算法,能够以手工计算的方式在一个给定的图上执行特定的算法求解问题。常见的应用问题直接给出或经过抽象,会成为下列问题:最小生成树求解(PRIM算法和KRUSKAL算法,两种方法思想都很简单,但要注意不要混淆这两种方法)https://yz.chsi.com.cn/kyzx/zyk/201109/20110919/233943381.html