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

数据结构与算法——最小生成树

1 引言 在之前的文章中已经详细介绍了图的一些基础操作。而在实际生活中的许多问题都是通过转化为图的这类数据结构来求解的,这就涉及到了许多图的算法研究。...最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。 3 普里姆算法—Prim算法 普里姆算法(Prim算法)是加权连通图里生成最小生成树的一种算法。...(4)最终,所有记录的最短距离的边构成的树,即是最小生成树。 3.2 算法图解 例如:图3.2.1所示的带权无向图,采用Prim算法构建最小生成树过程如下。...每次循环迭代所需要的计算时间:每次检查所有边的时间复杂度为O(m)。所以总的复杂度为O(e*logv)。 6 基于权矩阵的最小生成树算法   徐建军、沙力妮等发表了一篇一种新的最小生成树算法文章。...此算法是从最小生成树的性质出发,通过构造权矩阵的方式来得到图的最小生成树。   设图G1是图G的最小生成树,则G1具有如下性质:   (1)G1中的各条边权值之和最小。

1.6K30

数据结构 最小生成树之Kruskal算法

Kruskal算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法 大话数据结构定义 假设 。图中每个顶点自成一个连通分量。...Kruskal算法图解 以上图G4为例,使用克鲁斯卡尔算法进行演示实现最小生成树,用parent表示 第零步: 将邻接矩阵转换为边表数组,并且按权值大小排序 第一步: 将边加入最小生成树中 ​...边的权值最小,故将其加入最小生成树 第二步: 将边加入最小生成树中 ​ 上一步操作后, 边的权值最小,故将其加入最小生成树 第三步: 将边加入最小生成树中 ​ 上一步操作后, 边的权值最小,故将其加入最小生成树...此时,最小生成树构造完成,含有的依次为 Kruskal算法要点 对图的所有边按照权值大小排序 此问题可通过代码实例理解 将边添加到最小生成树中,如何判断是否形成回路 通过记录每个顶点在最小生成树中的终点...终点即在最小生成树中与它连通的最大顶点。每次添加一条边到最小生成树中时,判断该边的两个顶点的终点是否重合,重合则构成回路。

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

    数据结构 最小生成树之Prim算法

    求无向网的最小生成树的算法有两种:Prim和Kruskal,它们都是利用最小生成树的MST性质得到的。 Prim算法思想: 逐渐长成一棵最小生成树。...假设G=(V,E)是连通无向网,T=(V,TE)是求得的G的最小生成树中边的集合,U是求得的G的最小生成树所含的顶点集。初态时,任取一个顶点u加入U,使得U={u},TE=Ø。...重复下述操作:找出U和V-U之间的一条最小权的边(u,v),将v并入U,即U=U∪{v},边(u,v)并入集合TE,即TE=TE∪{(u,v)}。直到V=U为止。...最后得到的T=(V,TE)就是G的一棵最小生成树。也就是说,用Prim求最小生成树是从一个顶点开始,每次加入一条最小权的边和对应的顶点,逐渐扩张生成的。 我们举一个例子?...memset(adj,0,sizeof(adj)); //将邻接矩阵所有元素赋为0 } void MGraph::InsertEdge(int i,int j,int p) //插入顶点i、j依附的边以及该边的权值

    48320

    Prim算法生成最小生成树

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

    19230

    数据结构01-最小生成树-Prim算法

    -1条边; 最小生成树 (简称MST) 给定一个带权的无向连通图,如何选取一棵生成树,使得树上所有边的权总和最小,这棵生成树就叫做最小生成树; 给定N个顶点的无向连通图,其最小生成树一定有N-1条边;...最小生成树中含有N个顶点; 最小生成树中的N-1条边都在给定的无向连通图中; 问题引出 首先看这样一个场景: ?... 中最短的那条,即 ,将B与A–G连通; prim算法介绍 普利姆(Prim)算法求最小生成树...(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合 2)若从G中一个顶点v开始构造最小生成树的,则先从V集合中取出v放入集合U中; 3)寻找集合U中顶点ui与集合V-U中顶点vj之间权值最小且不形成回路的边...System.out.println("-----从" + data[0] + "开始的最小生成树-----"); minTree.prim(graph, 0); } } //创建最小生成树

    55920

    数据结构—最小生成树

    目录 一、生成树 二、最小生成树(代价最小树) 三、求最小生成树 1、Prim算法(普里姆)  2.Kruskal 算法(克鲁斯卡尔) 3.Prim算法和Kruskal算法对比 ---- 一、生成树...最小生成树可能有多个,但边的权值之和总是唯一且最小的 最小生成树的边数=顶点数–1。...砍掉一条则不连通,增加一条边则会出现回路 如果一个连通图本身就是—棵树,则其最小生成树就是它本身 只有连通图才有生成树,非连通图只有生成森林 三、求最小生成树 1、Prim算法(普里姆)...  Prim算法(普里姆): 从某一个顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。...这个也是最终的最小生成树(红线连接部分) 2.Kruskal 算法(克鲁斯卡尔) Kruskal算法(克鲁斯卡尔)∶ 每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选) 直到所有结点都连通

    1.2K20

    图的最小生成树算法

    这是百度百科上的一张有权图的图片,和无权图相比多了边的权值。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

    数据结构–最小生成树详解

    ,每一颗生成树都可以作为一个通信网,当我们构造这个连通网所花的成本最小时,搭建该连通网的生成树,就称为最小生成树。...构造最小生成树有很多算法,但是他们都是利用了最小生成树的同一种性质:MST性质(假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u属于U,v属于...V-U,则必定存在一颗包含边(u,v)的最小生成树),下面就介绍两种使用MST性质生成最小生成树的算法:普里姆算法和克鲁斯卡尔算法。...另外,Prim算法的时间复杂度都是和边无关的,都是O(n*n),所以它适合用于边稠密的网建立最小生成树。...这里同样我们给出一个和Prim算法讲解中同样的例子,模拟克鲁斯卡算法生成最小生成树的详细的过程: 首先完整的图如下图: 然后,我们需要从这些边中找出权重最小的那条边,可以发现边(v1,v3)这条边的权重是最小的

    1K40

    数据结构(十):最小生成树

    最小生成树是带权无向连通图中权值最小的生成树,根据图中生成树定义可知, ? 个顶点的连通图中,生成树中边的个数为 ? ,向生成树中添加任意一条边,则会形成环。...生成树存在多种,其中权值之和最小的生成树即为最小生成树。 最小生成树保证最小权值是固定的,但是最小生成树可能有多个。 若 ? 为最小生成树 ? 的一个真子集,即 ?...中的某个顶点。 kruskal 算法 kruskal 算法即为上述第一种原则,通过选择图中的最小权值边来构造最小生成树,过程中需要注意避免形成环。...prim 算法 kruskal 算法的过程为不断对子图进行合并,直到形成最终的最小生成树。...所以prim 算法的时间复杂度为 ? 。 代码及测试 github 链接:最小生成树

    75230

    数据结构与算法(十三)——连通图的最小生成树问题

    一、最小生成树的定义介绍 1,连通图的生成树 一个连通图的生成树指的是,极小的连通子图,它含有图中的全部n个顶点,但是只足以构成一棵树的(n-1)条边。...2,连通图的最小生成树 首先来看一个题目。 如上图所示,假设现在有N个顶点,每个顶点连接的路径是不一样的。请你设计一个算法,快速找出能覆盖所有顶点的路径。...实际上,上面这道题目就是在求连通图的最小生成树。...通过上面的例子,我们可以知道,连通图的最小生成树指的就是,连通图的所有生成树中路径最小的那一个生成树。 二、普里姆(Prim)算法 需要事先说明的一点是,我们这里采用邻接矩阵的方式来存储图结构。...>countOfVertexes; j++) { graph->edges[j][i] = graph->edges[i][j]; } } } // 二、通过Kruskal算法来获取到连通图的最小生成树

    3.9K20

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

    算法步骤 Prim 算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中,算法从某一个顶点开始,逐渐长大覆盖整个连通网的所有顶点。 1....初始化U={u0},T={ },其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0 出发; 2....如果U=V,则算法结束,否则重复以上步骤。最后得到最小生成树 MinT=,其中T为最小生成树的边的集合。 ? 算法实例 下面是一个无向带权图和对应的邻接矩阵。 ?..., &i, &j, &w); G.edge[i][j] = w; G.edge[j][i] = G.edge[i][j]; }; } // prim算法求最小生成树...adjvex[i] = 0; }; cout 最小生成树为:" << endl; // 循环所有顶点,构造最小生成树

    60730

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

    最小生成树: 构造连通图的最小代价生成树称为最小生成树,也就是说,所有的边加权后和最小的树。 Prim算法 Prim算法计算最小生成树的方法从一个结点开始使树一点点的成长。...这个过程主要体现在“加点”,在算法进行的过程中,有一个已经添加到树上的顶点集,这个顶点集实际就是最小生成树的结点集合,其余顶点都作为选择,等待是否被加入集合。...下面通过图示来描述Prim算法的思想:首先选择一个顶点作为起始,比如A,第一轮发现AC代价最小,那么就把AC边加入最小生成树,把A加入顶点集合; 后面依次寻找最小代价边,直到全部顶点都加入到顶点集合。...*/ } } } } Kruskal算法 Prim算法是以某个顶点开始,逐步寻找各个顶点上最小权值的边,这样一步步来构建最小生成树。...在形式上Kruskal算法是在处理一个森林,开始的时候,存在n棵单结点的树,每次添加一条边把两棵树合并成一棵树,当算法终止时剩下的一棵树就是最小生成树。

    9210

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

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

    2K20

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

    而今天我们要说一个非常实用的算法——最小生成树的建立!这是图论中一个经典问题,可以使用Kruskal和Prim两种算法来进行实现!...1 什么是最小生成树 在给定一张无向图,如果在它的子图中,任意两个顶点都是互相连通,并且是一个树结构,那么这棵树叫做生成树。当连接顶点之间的图有权重时,权重之和最小的树结构为最小生成树!...在实际中,这种算法的应用非常广泛,比如我们需要在n个城市铺设电缆,则需要n-1条通信线路,那么我们如何铺设可以使得电缆最短呢?最小生成树就是为了解决这个问题而诞生的! ?...最小生成树 如上图所示,一幅两两相连的图中,找到一个子图,连接到所有的节点,并且连接边的权重最小(也就是说边的数量也是最小的,这也保证了其是树结构). 2 Kruskal算法(克鲁斯卡算法) Kruskal...算法是一种贪心算法,我们将图中的每个edge按照权重大小进行排序,每次从边集中取出权重最小且两个顶点都不在同一个集合的边加入生成树中!

    5.3K30
    领券