[数据结构]普里姆(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条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
随机推荐
- Can not set int field xxx to java.lang.Long 错误
Can not set int field xxx to java.lang.Long 错误 这个错误其实是因为Java程序和MySQL表中字段的属性匹配不一致 我的报错是Can not set ja ...
- 这才是使用ps命令的正确姿势
这才是使用ps命令的正确姿势 前言 在linux系统当中我们通常会使用命令去查看一些系统的进程信息,我们最常使用的就是 ps (process status).ps 命令主要是用于查看当前正在运行的程 ...
- python深拷贝、浅拷贝
.copy() 浅拷贝 如上图 定义列表A指向一个元素,列表A里面嵌套两层列表分布指向两个元素,定义列表B,列表B=A,列表C浅拷贝列表A 从图上可以看出,列表A和列表B指向的是同一个列表元素,而 ...
- C#中下载项目中的文件
1.将需要下载的文档添加到项目的文件夹中 2.接口部分 public IActionResult DownLoad() { var filePath = Directory.GetCurrentDir ...
- Pictionary 方法记录
[COCI2017-2018#5] Pictionary 题面翻译 题目描述 在宇宙一个不为人知的地方,有一个星球,上面有一个国家,只有数学家居住. 在这个国家有\(n\)个数学家,有趣的是,每个数学 ...
- web安全学习(sql注入1)
web安全学习(sql注入1) 一.简介 sql语句就是数据库语句,而sql注入就是用户将自己构造的恶意sql语句提交,然后服务器执行提交的危险语句.sql注入可能造成信息泄露以及服务器被控制等危害. ...
- Day2:基本的Dos命令
打开CMD的方式 开始+系统+命令提示符(右键以管理员身份运行可拿到最高权限) Win键+R 输入 cmd打开控制台(推荐使用) 桌面上按住shift+鼠标右键,打开powershell窗口 文件搜索 ...
- Linux系统安装python
1. 安装python3 1.1 下载python3安装包及其依赖包(该步骤可忽略,步骤1.2 提供应用包链接) ① 在python官网下载所需的python3,或者用外网centos机器的wget命 ...
- Windows操作系统搭建Lsky Pro
写在前面 本文主要介绍在Windows下部署兰空图床,以及安装过程, 非Windows系统可以参考本文章的安装流程,结合自己系统版本进行部署 图床用处 图床在日常的用处非常广泛,尤其对于经常写博客的人 ...
- hutool包的DateUtil工具类
[首先引入依赖 ] <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core& ...