最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个加权无向连通图,如何选择一个生成树,使权利的最小总和的边缘所有树,叫最小生成树.

求最小生成树算法

(1) 克鲁斯卡尔算法

图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间.

(2) 

p=1313">普里姆算法

图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 .



以下来详细讲下:

克鲁斯卡尔算法

方法:将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)

第一步:由边集数组选第一条边

第二步:选第二条边,即权值为2的边

第三步:选第三条边,即权值为3的边

第四步:选第四条边,即权值为4的边

第五步:选第五条边



普里姆算法

方法:从指定顶点開始将它增加集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,并将集合外的那个顶点增加到集合中,表示该顶点已连通.再用集合内的顶点与集合外的顶点构成的边中找最小的边,并将对应的顶点增加集合中,如此下去直到所有顶点都增加到集合中,即得最小生成树.

例在下图中从1点出发求出此图的最小生成树,并按生成树的边的顺序将顶点与权值填入表中.

———————>先写出其邻接矩阵

第一步:从①開始,①进集合。用与集合外全部顶点能构成的边中找最小权值的一条边

①——②权6

①——③权1 -> 取①——③边

①——④权5

第二步:③进集合,①,③与②,④,⑤,⑥构成的最小边为

①——④权5

③——⑥权4 -> 取③——⑥边

第三步:⑥进集合,①,③,⑥与②,④,⑤构成的各最小边

①——②权6

③——②权5

⑥——④权2 -> 取⑥——④边

第四步:④进集合,①,③,⑥,④与②,⑤构成的各最小边

①——②权6

③——②权5 -> 取③——②边

⑥——⑤权6

第四步:②进集合,①。③,⑥,②,④与⑤构成的各最小边

②——⑤权3 -> 取②——⑤边



这也是在网上找到的一个Kruskal和Prim构造过程图,贴出来:

时间: 2024-11-08 08:20:17

最小生成树(普利姆算法、克鲁斯卡尔算法)的相关文章

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

上篇博客我们聊了图的物理存储结构邻接矩阵和邻接链表,然后在此基础上给出了图的深度优先搜索和广度优先搜索.本篇博客就在上一篇博客的基础上进行延伸,也是关于图的.今天博客中主要介绍两种算法,都是关于最小生成树的,一种是Prim算法,另一个是Kruskal算法.这两种算法是很经典的,也是图中比较重要的算法了. 今天博客会先聊一聊Prim算法是如何生成最小生成树的,然后给出具体步骤的示例图,最后给出具体的代码实现,并进行测试.当然Kruskal算法也是会给出具体的示例图,然后给出具体的代码和测试用例.当

c/c++ 用普利姆(prim)算法构造最小生成树

c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ? 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时,自然会考虑,如何在最节省经费的前提下建立这个公路网络. ? 每2个城市之间都可以设置一条公路,相应地都要付出一定的经济代价.n个城市之间,最多可以设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少? 普利姆(prim)算法的大致思路: ? 大致思想是:设图G顶点

最小生成树——普利姆 克鲁斯卡尔

最小生成树 生成树定义:是原图的一个极小连通子图,含有原图的全部顶点,但只有n-1条边.它连通但边只有n-1,也就是说任意让两点连边必定成环,不过这结论好像没啥用. 最小生成树:对于一张图的生成树可能有多种,对于边权和最小的一种就是最小生成树了. prim算法 首先首先,我们来几个标识,原图是N={V,E},TE是N上最小生成树的边集,然后有个已选点集合U,那么未选点集就是V-U了. 首先,先来个起点,加入到U里面. 然后,在所以边(a,b),a属于U,b属于V-U里面,找一条权值最小的边(a0

POJ-2421-Constructing Roads(最小生成树 普利姆)

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26694   Accepted: 11720 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two

最小生成树普利姆算法

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 20#define INFINITY  0x7ffffffftypedef struct{    int U[MAX][MAX];    char adj[MAX][10];    int vexnum, arcnum;}Graph;typedef struct{    char

最小生成树 - 普利姆算法

#include<cstdlib> #include<cstdio> #include<cstring> #define MAXVEX 100 #define INFINITY 65535 typedef struct { char vexs[MAXVEX]; int arc[MAXVEX][MAXVEX]; int numVextexes,numEdges; }MGraph; void CreateGraph(MGraph *G){ int i,j,k,w; prin

最小生成树--克鲁斯卡尔算法(Kruskal)

按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什么是最小生成树? •定义: 先引入一个定理:N个点用N-1条边连接成一个联通块,形成的图形只可能是树,没有别的可能: 根据这个定理,我们定义:在一个有N个点的图中,选出N-1条边出来,连接所有N个点,这N-1条边的边权之和最小的方案: •最小生成树之prim算法:   由于本蒟蒻还不会这个算法,所以

(转)最小生成树之普利姆算法、克鲁斯卡尔算法

 最小生成树之prim算法 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以把边上的权值解释为线路的造价.则最小生成树表示使其造价最小的生成树. 构造网的最小生成树必须解决下面两个问题: 1.尽可能选取权值小的边,但不能构成回路: 2.选取n-1条恰当的边以连通n个顶点: MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集.若(

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1.概念:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 2.应用:例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低.这就需要找到带权的最小生成树. 3.求最小生成树的算法 3.1 普里姆(Prim)算法 方法:从指定顶点开始将它加入集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树