[数据结构]普里姆(Prim)算法生成最小生成树
前提介绍:最小生成树概念
一个连通图的生成树是图的极小连通子图,它包含图中的所有定点,并且只含尽可能少的边,这意味着对于生成树来说,就砍去使生成树变成非连通图;若给它怎家一条边就会形成图中的一条回路。
对于一个带权连通无向图G=(V,E),生成树不同,每个树的权也可能不同。设W为G的所有生成树的集合,若T为G中边的权值之和最小的那棵生成树,则T成为G的最小生成树。
Prim算法概念
Prim算法的执行非常类似于寻找图的最短路径的Dijkstra算法。假设N={V,E}是连通网,Et是N上最小生成树中边的集合。算法从Vt={u0}(u0∈V),Et={}开始,重复执行下述操作:在所有u∈Vt,v∈V-Vt的边(u,v)∈E中找一条代价最小的边(u0,v0)并加入集合Et,同时将v0并入Vt,直到Vt=V为止。此时Et中必有n-1条边,则T={Vt,Et}为N的最小生成树。
Prim算分的步骤如下:
初始化:向空树T=(Vt,Et)中添加图G=(V,E)的任一定点u0,使Vt={u0},Et=空集;
循环下述操作:从图G中选择满足{(u,v)|u∈Vt,v∈V-Vt}且具有最小权值的边(u,v),并置Vt=Vt∪{v},Et=Et∪{(u,v)}。
实例及解析
第一步:
从图中选择一条最短的边加入集合,不难看出,1是此时最短的边。
第二步:
此时我们可以从V1,V2两个顶点出发,寻找下一个定点与这两个顶点之一相连,并且能使相连的這条边是最短的,所以我们下一个选择的是V6,此时顶点集合有:V1,V3,V6。
第三步:
从V1,V3,V6三个顶点出发,我们要寻找下一条最短的边,不难发现,此时2是最短的那一条边,连接V6,V4,所以把它加入边的集合(要注意,加入的边不能使生成树带有回路!),此时顶点集合:v1,v3,v4,v6
第四步:
从V1,V3,V6,V4四个顶点出发,寻找下一条最短的边并且不能使生成树带有回路,此时可以发现,V3到V2的5是最短的这条边。
第五步:
最后一步,从V1,V2,V3,V6,V4的顶点出发,寻找吓下一条最短的边,并且不能形成回路,很明显V2到V5这条边最短,加入之后最小生成树已经形成。
伪代码实现
void Prim(G,T){
T=空集;//初始化空树
U={w};//添加任一顶点)
while((V-U)!=空集){
设(u,v)是使u∈U与v∈(V-U),且权值最小的边;
T=T∪(u,v); //边归入树
U=U∪{v}; //顶点归入输
}
}
算法的复杂度
Prim算法的时间复杂度为O(|V|²),不依赖于|E|,因此它很适合于求解边稠密的图的最小生成树,虽然采用其他办法可以改进Prim算法的时间复杂度,但增加了实现的复杂性。
[数据结构]普里姆(Prim)算法生成最小生成树的更多相关文章
- 图的普里姆(Prim)算法求最小生成树
关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...
- 普里姆Prim算法介绍
普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T ...
- 图解最小生成树 - 普里姆(Prim)算法
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...
- JS实现最小生成树之普里姆(Prim)算法
最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...
- 普里姆(Prim)算法
/* 普里姆算法的主要思想: 利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录 */ # include <stdio.h> typedef char Ve ...
- 图论---最小生成树----普利姆(Prim)算法
普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 最小生成树-普利姆(Prim)算法
最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- 经典问题----最小生成树(prim普里姆贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
随机推荐
- 后端框架学习-----mybatis(使用mybatis框架遇到的问题)
1.配置文件没有注册(解决:在核心配置文件中注册mapper,注册有三种形式.资源路径用斜杆,包和类用点) <mappers> <!--每一个mapper.xml文件都需要在myba ...
- 前端无法渲染CSS文件
问题描述: 启动前端后,发现前端的页面渲染不符合预期,看情况应该是css文件没有生效. 排查步骤: 查看有无报错信息. 查看后台输出,没有可用的提示信息,如图: 确认 css 的路径没错. 前端打包后 ...
- 【单元测试】Junit 4(四)--Junit4参数化
1.0 前言 JUnit 4引入了一项名为参数化测试的新功能.参数化测试允许开发人员使用不同的值反复运行相同的测试. 1.1 参数化设置 这里我们直接上例子吧. 题目: 输入小写的字符串.如字 ...
- JS学习笔记 (三) 对象进阶
1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ...
- Revit2021保姆级安装教程
Revit2021 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载Revit_2021软件安装包到电脑磁盘里,并解压缩,安装全程需连接网络,然后双击打开Revit_ ...
- Window10开机键盘映射
一.映射工具 1.github地址 https://github.com/susam/uncap 2.映射方式 (1)CapsLock映射成ESC键 uncap 0x1b:0x14 (2)CapsLo ...
- centos8换可用公网yum源
这个咋说呢,总之就是非常简单 百度上找一个公网源替换进去就好 但是就是麻烦,在此做个笔记,也当给大家一个现成的范例 以下为https://vault.centos.org官网源的一个简单的替换脚本,一 ...
- (GCC) C++代码中使用#pragma GCC optimize / #pragma G++ optimize
科学计算用优化 经过实验证明这个命令优化效果最好,把我的 1.2S 的 FFT 优化到了 0.4S使用 pragma 命令优化程序: #pragma GCC optimize("Ofast, ...
- vue3.0使用tui.image-editor图片编辑组件报错TypeError: Cannot convert undefined or null to object
在vue3.0的项目中使用tui.image-editor组件.一直都是报错.查看报错位置发现代码 addEventListener() { Object.keys(this.$listeners). ...
- C# Aspose.Words.Document.PageCount 踩坑笔记(获取文档页数)
事情是这样的,我需要获取Word文档的页数,结果就遇到了这个坑人的问题. var doc = new Aspose.Words.Document(@"相对路径"); doc.Pag ...