首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最小生成树——普里姆算法(prim)

生成树就是在保证自身是树(不存在环)的前提下,拥有尽可能多的边,它拥有G的所有顶点。 最小生成树就是指,各边权值总和最小的生成树。...举个例子,下面左边这个加权图的最小生成树就如右图所示 普里姆算法 1、设图G = (V,E)所有顶点的集合为V,最小生成树中顶点的集合为T。...2、循环执行下述处理直至T=V 在连接T内顶点与V-T内顶点的边中选取权值最小的边,并将其作为最小生成树的边,将u添加到最小生成树里面。 实现普里姆算法的关键在于如何保存权值最小的边。...对于无向加权图,普里姆算法的处理过程如下图所示: 我们在具体的代码实现中,对于邻接矩阵表示法,应该把不存在的边的值设置为无穷大,那么我们就可以比较方便地实现代码。...,我们需要遍历图的所有顶点来确定最小的顶点u,且整个算法的遍历次数与顶点数相等,因此算法复杂度为O(n2). ps:如果使用二叉堆(优先级队列)来选定顶点,那么普里姆算法的效率将大大提高。

1.1K20

最小生成树算法(上)——Prim(普里姆)算法

概述 最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。...对于最小生成树算法最著名的有两种:Prim算法与Kruskal算法。 ---- Prim算法 Prim算法思想描述: Prim算法可以简单描述成一句话:让一个小树慢慢长大。...Prim算法过程描述: 1)首先定一个最小生成树MST初始化为空(即不含有任何边),初始化距离数组dist为正无穷,表示所有结点到最小生成树的距离(即不可达),定义父亲数组parent来记录一个结点的父亲结点...//普里姆(Prim)算法,已vertex为根节点的的最小生成树 int Prim(int vertex){ int cnt = 0; /...} //普里姆(Prim)算法,已vertex为根节点的的最小生成树 int Prim(int vertex){ int cnt = 0;

90720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    算法:图解最小生成树之普里姆(Prim)算法

    找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法,这里介绍普里姆算法。 为了能够讲明白这个算法,我们先构造网图的邻接矩阵,如图7-6-3的右图所示。 ?...下面我们对着程序和每一步循环的图示来看: 算法代码:(改编自《大话数据结构》) /* Prim算法生成最小生成树  */ void MiniSpanTree_Prim(MGraph MG) {     ...上面所述为第一次循环,对应下图i = 1的第一个小图,由于要用文字描述清楚整个流程比较繁琐,下面给出i为不同值一次循环下来后的生成树图示,所谓一图值千言,大家对着图示自己模拟地循环8次就能理解普里姆算法的思想了...即最小生成树的边为:(0, 1), (0, 5), (1, 8), (8, 2), (1, 6), (6, 7), (7, 4), (7, 3) 最后再来总结一下普里姆算法的定义: Screenshot...对比普里姆和克鲁斯卡尔算法,克鲁斯卡尔算法主要针对边来展开,边数少时效率比较高,所以对于稀疏图有较大的优势;而普里姆算法对于稠密图,即边数非常多的情况下更好一些。

    2.5K90

    最小生成树----prim算法----普利姆算法

    生成树的概念 最小生成树的定义 生成树的代价和最小生成树 MST性质 普利姆(prim)算法 图解: 使用哪一种结构进行存储?...int i = 0; i < verNum; i++) { DFS(i); } } //输出最小生成树的路径 void outputMST(shortEdge* se,int k) { cout....lowcost= 0; //lowcost=0表示放入集合U //注意循环结束条件是verNum-1,因为最小生成树只有N-1条边 for (int i = 0; i < verNum-1; i+...+) { //寻找从当前顶点出发到达所有与之有边的顶点,找到耗费最小代价就可以到达的邻接点k int k = minEdge(start); outputMST(se,k);//输出最小生成树的路径...< endl;; p.DFSTravers(); cout << endl; cout << "输出邻接矩阵信息: " << endl; p.output(); cout 最小生成树

    2.2K30

    数据结构与算法-最小生成树之普里姆(Prim)算法

    算法步骤 Prim 算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中,算法从某一个顶点开始,逐渐长大覆盖整个连通网的所有顶点。 1....初始化U={u0},T={ },其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0 出发; 2....如果U=V,则算法结束,否则重复以上步骤。最后得到最小生成树 MinT=,其中T为最小生成树的边的集合。 ? 算法实例 下面是一个无向带权图和对应的邻接矩阵。 ?...adjvex[i] = 0; }; cout 最小生成树为:" << endl; // 循环所有顶点,构造最小生成树...对比普里姆和克鲁斯卡尔算法,克鲁斯卡尔算法主要针对边来展开,边数少时效率比较高,所以对于稀疏图有较大的优势;而普里姆算法对于稠密图,即边数非常多的情况下更好一些。

    60530

    普里姆算法(修路问题)

    修路问题 这就是经典的修路问题,就可以用普里姆算法来解决。 2.最小生成树: 要使总里程数最小,那么就要尽可能修少路,并且修的每条路距离应该小,这样加起来的总里程数才会少。...下面是一个图和它对应的生成树: ? 生成树 这是这个图对应的其中三种生成树,每条边有权值,权值加起来最小的那棵树,就叫做最小生成树。求最小生成树,可以用普里姆算法和克鲁斯卡尔算法。...二、普里姆算法步骤: ? 修路问题 还是以这个图为例,普里姆算法过程如下: 创建一个集合,保存选择的顶点。首先选取顶点A,表示从A开始处理,将A加入到集合中。...edges.length; i++) { System.out.println(Arrays.toString(edges[i])); } } } 现在,就要在最小生成树类中用普里姆算法创建最小生成树...,中MinTree类中加一个方法,如下: /** * 普里姆算法创建最小生成树 * @param graph 图 * @param currentVertex 开始处理的顶点 */ public Map

    43320

    软考高级架构师:最小生成树和克鲁斯卡尔算法、普利姆算法

    克鲁斯卡尔(Kruskal)算法和普利姆(Prim)算法是解决最小生成树问题的两种著名算法。 最小生成树(MST) 最小生成树是指在一个加权连通图中寻找一棵包含图中所有顶点且总边权值最小的生成树。...普利姆(Prim)算法 普利姆算法也是基于贪心策略,但其构造最小生成树的方式与克鲁斯卡尔算法不同。普利姆算法每步扩展生成树,直到包含所有顶点。 从图中的某个顶点开始,将该顶点加入生成树中。...普利姆算法 在使用普利姆算法时,初始时生成树包含多少个顶点? A. 0 B. 1 C. 图中所有顶点的数量 D. 图中顶点数量的一半 下列哪个场景最适合使用最小生成树算法? A....克鲁斯卡尔算法采用贪心策略,按边的权重从小到大排序后选择,以此构造最小生成树。 答案:B。普利姆算法在每一步选择连接生成树和非生成树顶点的最小边。 答案:C。...在使用普利姆算法时,初始时生成树包含1个顶点。 答案:C。最小生成树算法适合用于网络设计的最小成本连线场景。 三、真题

    14400

    算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)

    今天博客中主要介绍两种算法,都是关于最小生成树的,一种是Prim算法,另一个是Kruskal算法。这两种算法是很经典的,也是图中比较重要的算法了。...换句话说,是每个村庄连通,并且总线路最短,如果线连接完毕后,其实就是我们本篇博客要聊的最小生成树。 一、普利姆算法 接下来我们就来聊Prim算法。...其实Prim算法创建最小生成树的主要思路就是从候选节点中选择最小的权值添加到最小生成树中。下图是我们之前创建的图使用Prim算法创建最小生成树的完整过程。...二、克鲁斯卡尔算法 上一部分我们详细的讲解了Prim算法的整个过程,接下来就来聊一下最小生成树的另一个经典的算法Kruskal算法。...2.寻找节点的尾部节点 在上述算法中,判断新添加的边是否在最小生成树中构成回路是该算法的关键。

    1.2K70

    Prim算法生成最小生成树

    最小生成树 对于一个图,我们可以把它转换成一颗树(联通图)或者是多棵树(非联通树)。 对于一个带权值的联通图,最小生成树就是它的所有生成树中边权值和最小的生成树。...Prim算法  Prim算法就是一种用来生成最小生成树的算法。 由一个带权值的联通图到一个最小生成树的过程,其实就是从图的所有边中挑出一部分边用来组成树的过程,所以关键在于如何挑选边。...对于Prim算法,它的具体操作是这样的: 对于给定的一个起点节点(Prim算法必须给它一个起点),先找出这个节点连接的所有节点所组成的边中权值最小的边,作为最小生成树的第一条被挑选出来的边,现在我们有两个节点了对吧...然后以这两个节点为基础,继续找出这两个点连接的所有节点所组成的边中权值最小的边,同时这个查找过程,需要注意不能找已经连起来的节点,具体体现在代码实现上就是每找到节点就标记一下。 看过程图:

    19230

    图的最小生成树算法

    这是百度百科上的一张有权图的图片,和无权图相比多了边的权值。Ok,那么最小生成树算法是什么呢?...求最小生成树的算法主要有两种:克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。...以上面那个无向图为例,我们来模拟一下最小生成树的构造过程: ? 这是笔者在纸上模拟的过程,到最后,生成的最小生成树的权值之和为 15 。...下面我们来看一下 Prim 算法的核心思想: 我们换个角度思考一下:既然最后我们需要的最小生成树一定要有 n 个顶点,那么我们直接向这个最小生成树加入图的顶点就行了。...count++; /* * 更新最小生成树的总权值:最小生成树的总权值等于最小生成树原来的权值 * 加上刚刚加入最小生成树的顶点到最小生成树的距离

    2.6K20

    最小生成树的Kruskal算法

    定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。...[1] 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。...Kruskal算法简述: 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点...之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之...forest.add(item) edges = sorted(edges, key=lambda element: element[2]) num_sides = len(nodes)-1 # 最小生成树的边数等于顶点数减一

    2K20

    最小生成树算法:Kruskal 与 Prim算法

    最小生成树 连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不再连通;反之,在其中引入任何一条新边,都会形成一条回路。...因此构造最小生成树的准则有三条: 只能使用图中的边来构造最小生成树 只能使用恰好 n-1 条边来连接图中的 n 个顶点 选用的 n-1 条边不能构成回路 构造最小生成树的方法:Kruskal...贪心算法不是对所有的问题都能得到整体最优解(也就是说这两种算法不是万能的)。 并且 最小生成树是不唯一的!...除了 Kruskal 算法以外,普里姆算法(Prim 算法)也是常用的最小生成树算法。...总的来说,Prim 算法是 以点为对象,挑选与点相连的最短边来构成最小生成树。而 Kruskal 算法是以边为对象,不断地加入新的不构成环路的最短边来构成最小生成树。

    2K20

    最小生成树(Kruskal算法和Prim算法)

    而今天我们要说一个非常实用的算法——最小生成树的建立!这是图论中一个经典问题,可以使用Kruskal和Prim两种算法来进行实现!...1 什么是最小生成树 在给定一张无向图,如果在它的子图中,任意两个顶点都是互相连通,并且是一个树结构,那么这棵树叫做生成树。当连接顶点之间的图有权重时,权重之和最小的树结构为最小生成树!...最小生成树 如上图所示,一幅两两相连的图中,找到一个子图,连接到所有的节点,并且连接边的权重最小(也就是说边的数量也是最小的,这也保证了其是树结构). 2 Kruskal算法(克鲁斯卡算法) Kruskal...算法是一种贪心算法,我们将图中的每个edge按照权重大小进行排序,每次从边集中取出权重最小且两个顶点都不在同一个集合的边加入生成树中!...(普里姆算法) Prim算法是另一种贪心算法,和Kruskal算法的贪心策略不同,Kruskal算法主要对边进行操作,而Prim算法则是对节点进行操作,每次遍历添加一个点,这时候我们就不需要使用并查集了

    5.3K30

    最小生成树——Prim算法与Kruskal算法

    最小生成树: 构造连通图的最小代价生成树称为最小生成树,也就是说,所有的边加权后和最小的树。 Prim算法 Prim算法计算最小生成树的方法从一个结点开始使树一点点的成长。...这个过程主要体现在“加点”,在算法进行的过程中,有一个已经添加到树上的顶点集,这个顶点集实际就是最小生成树的结点集合,其余顶点都作为选择,等待是否被加入集合。...C语言实现 /*普利姆Prim算法求最小生成树*/ void mini_span_tree_prim(graph_type g) { int min = 0; /*保存最小权值*/ int...*/ } } } } Kruskal算法 Prim算法是以某个顶点开始,逐步寻找各个顶点上最小权值的边,这样一步步来构建最小生成树。...在形式上Kruskal算法是在处理一个森林,开始的时候,存在n棵单结点的树,每次添加一条边把两棵树合并成一棵树,当算法终止时剩下的一棵树就是最小生成树。

    9210
    领券