最小生成树prim算法详解

prim算法解决的是最小生成树问题,即在一个给定的无向图G中求一棵生成树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。

prim算法的基本思想是对图G设置集合S来存放已被访问的顶点,然后执行n次下面的两个步骤:

(1)每次从集合V-S中选择与集合S最近的一个顶点(记为u),访问u并将其加入集合S,同时把这条离集合S最近的边加入到最小生成树中。

(2)令顶点u作为集合S与集合V-S连接的接口,优化从u能到达的未访问顶点v与集合S的最短距离

prim算法和Dijkstra算法使用的思想几乎完全相同。只有在数组d[]的含义上有所区别。其中,Dijkstra算法的数组d[]含义为起点s到达顶点Vi的最短距离,而prim算法的数组d[]含义为顶点Vi与集合S的最短距离,两者的区别仅在于最短距离是顶点Vi针对“起点s”还是“集合S”。另外,对最小生成树问题而言,如果仅是求最小边权之和,那么在prim算法中就可以随意指定一个顶点为初始点,例如在下面的代码中默认使用0号顶点为初始点。实现的伪代码如下:

Prim(G,d[]){初始化;for(循环n次){u=使d[u]最小的还未被访问的顶点的标号;记u已被访问;for(从u出发能到达的所有顶点v){if(v未被访问&&以u为中介点使得v与集合S的最短距离d[v]更优){将G[u][v]赋值给v与集合S的最短距离d[v]; }} } 
}

下面给出分别使用邻接矩阵和邻接表的prim算法代码:

(1)邻接矩阵版

const int maxn=1000;
const int INF=1000000000;
int n,G[maxn][maxn];
int d[maxn];
bool vis[maxn]={false};
int prim(){//默认0为起始点,函数返回最小生成树的边权之和 fill(d,d+maxn,INF);d[0]=0;int ans=0;for(int i=0;i<n;i++){int u=-1,MIN=INF;for(int j=0;j<n;j++){//找到未访问的顶点中d[]最小的 if(vis[j]==false&&d[j]<MIN){u=j;MIN=INF;}}if(u==-1){return -1;}vis[u]=true;ans+=d[u];for(int v=0;v<n;v++){if(vis[v]==false&&G[u][v]!=INF&&G[u][v]<d[v]){d[v]=G[u][v];}}}return ans;
}

(2)邻接表版

struct node{int v,dis;
};
vector<node> Adj[maxn];
int n;
int d[maxn];
bool vis[maxn]={false};
int prime(){fill(d,d+maxn,INF);d[0]=0;int ans=0;for(int i=0;i<n;i++){int u=-1,MIN=INF;for(int j=0;j<n;j++){if(vis[j]==false&&d[j]<MIN){u=j;MIN=d[j];}}if(u==-1){return -1;}vis[u]=true;ans+=d[u];for(int j=0;j<Adj[u].size();j++){int v=Adj[u][j].v;if(vis[v]==false&&Adj[u][j].dis<d[v]){d[v]=Adj[u][j].dis;}}}return ans;
}

和Dijkstra算法一样,使用这种写法的复杂度为O\left ( V^{2} \right ),其中邻接表实现的prim算法可以使用堆优化使时间复杂度降为O\left ( VlogV+E \right )。所以尽量在图的顶点数目较少而边数较多的情况下使用prim算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【源码】【Spring+SpringMVC+MyBatis】电子商城网上购物平台的设计与开发

学生成绩管理系统 系统功能开发环境开发技术前端技术后端技术 系统展示登录界面注册界面系统首页商品详情页下单界面付款界面购物车界面 源码获取↓↓↓↓&#xff1a; 源码可在后台私信联系博主或文末添加博主微信获取帮助 系统功能 登录、注册模块&#xff1a;如果用户第一次…

基于Java+Swing+mysql幼儿园信息管理系统V2

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Day31 - Day35

Day31 - Day35 Day31&#xff08;1999年text5&#xff09; Science, in practice, depends far less on the experiments it prepares than on the preparedness of the minds of the men who watch the experiments. 在实践中&#xff0c;科学对实验的依赖远少于对实验观察者…

【网络编程】基于UDP的服务器端/客户端

UDP可看作是信件邮寄&#xff0c;邮寄过程可能会信件丢失&#xff0c;是一种不可靠的数据传输服务。 但UDP性能更高&#xff0c;实现更加简洁。流控制是区分UDP和TCP的最重要标志。 IP的作用就是让离开主机B的UDP数据包传递给主机B&#xff0c;UDP根据端口号将传到主机的数据包…

Python - OS模块+sys模块

一、OS模块基本用法&#xff1a; import osprint(os.getcwd()) # 获取当前工作目录os.chdir(data) # 改变当前脚本工作目录&#xff1b;相当于终端里面的cd命令 print(os.getcwd()) # 获取当前工作目录 运行结果&#xff1a; D:\__TC22008_VBF\FOTA-vFlash-AutoTest D:\__TC22…

js/javascript获取时间戳的5种方法

1.获取时间戳精确到秒,13位 const timestamp Date.parse(new Date()); console.log(timestamp);//输出 1591669256000 13位 2.获取时间戳精确到毫秒,13位 const timestamp Math.round(new Date()); console.log(timestamp);//输出 1591669961203 13位 3.获取时间戳精…

conda虚拟环境报错总结

创建conda虚拟环境 文章前景&#xff08;小白篇&#xff09;为什么要安装Anaconda&#xff1f;&#xff1f;&#xff1f; Conda创建虚拟环境遇到的错误总结错误1&#xff1a;jupyter 里面没有显示我的虚拟环境怎么办&#xff1f;错误2&#xff1a;配置pycharm的时候conda虚拟环…

百货商城优选 当嘉士利饼干成为艺术品

近日&#xff0c;全国各大美院毕业展正如火如荼展开&#xff0c;其中中国美院一学生的毕业作品——“记忆饼干”从中脱颖而出&#xff0c;引发关注。短短一天时间&#xff0c;“记忆饼干”相关视频在全网已收获超7w网友点赞与收藏&#xff0c;更是激发网友们不断去线下打卡合影…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪&#xff0c;眼下&#xff0c;台山四九镇的早稻长势喜人&#xff0c;沉甸甸的稻穗迎风而动&#xff0c;已进入破口抽穗的关键期&#xff0c;即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里&#xff0c;合作社负责人梁明喜正仔细观察着稻苗的…

node aws

基础&#xff08;菜鸟教程&#xff09;框架&#xff1a; expressEgg.js(底层框架express)koa(自定义强&#xff0c;小而精简&#xff0c;白话就是什么都没有&#xff0c;自己diy&#xff0c;考验架构技术&#xff0c;搞得好比nest.js开发效率还高&#xff0c;同时框架精简)nest…

消费全返如何盈利?新零售分销营销模式解析

在当今竞争激烈的商业环境中&#xff0c;如何有效地吸引并留住顾客&#xff0c;同时实现销售额的持续增长&#xff0c;是每个商家都在思考的问题。我们团队经过深入研究和实践&#xff0c;成功开发了一套积分消费全返模式&#xff0c;它不仅帮助贵州的一位老板在短短一年内实现…

持续总结中!2024年面试必问 20 道并发编程面试题(四)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道并发编程面试题&#xff08;三&#xff09;-CSDN博客 七、请解释什么是原子操作。 原子操作&#xff08;Atomic Operation&#xff09;是指在多线程环境中&#xff0c;一个操作或者一系列操作&#xff0c;要…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十二)- 微服务(12)

目录 12.8 RestClient查询文档 12.8.1 快速入门 12.8.2 match&#xff0c; term&#xff0c;bool&#xff0c;range查询 12.8.3 排序和分页 12.8.4 高亮 12.8 RestClient查询文档 12.8.1 快速入门 Testvoid testMatchALL() throws IOException {// 1. 准备requestSearchReq…

以bert为例,了解Lora是如何添加到模型中的

以bert为例,了解Lora是如何添加到模型中的 一.效果图1.torch.fx可视化A.添加前B.添加后 2.onnx可视化A.添加前B.添加后 3.tensorboard可视化A.添加前B.添加后 二.复现步骤1.生成配置文件(num_hidden_layers1)2.运行测试脚本 本文以bert为例,对比了添加Lora模块前后的网络结构图…

Linux下的GPIO编程

目录 一、前言 二、sysfs方式 1、sysfs简介 2、基本目录结构 3、编号计算 4、sysfs方式控制GPIO 三、libgpiod库 1、libgpiod库简介 2、API函数 四、LED灯编程 一、前言 在Linux下&#xff0c;我们通常使用 sysfs 和 libgpiod库 两种方式进行控制GPIO&#xff0c;目前…

DDei在线设计器-属性编辑器

DDei-Core-属性编辑器 DDei-Core-属性编辑器插件包含了文本、大文本、数值、下拉、单选、勾选以及颜色等属性编辑。 图形和属性共同构成一个完整的定义&#xff0c;属性编辑器就是编辑属性值的控件。当选中图形实例时&#xff0c;属性面板就会展现当前实例的所有属性以及属性编…

通过身份证号码计算年龄

一、需求分析 在一些需要精确统计用户年龄的场景中。 如果我们使用之间由用户填写自己年龄的方式的话&#xff0c;就无法保证用户填写的信息是准确的其中最有效的办法就是让用户进行实名认证&#xff0c;再由用户上传的身份证号码截取到出生日期&#xff0c;通过计算后得到用…

m4s转mp3——B站缓存视频提取音频

前言 しかのこのこのここしたんたん&#xff08;鹿乃子乃子虎视眈眈&#xff09;非常之好&#xff0c;很适合当闹钟&#xff0c;于是缓存了视频&#xff0c;想提取音频为mp3 直接改后缀可乎&#xff1f;格式转换工具&#xff1f; 好久之前有记录过转MP4的&#xff1a; m4s转为…

nacos配置实时刷新@RefreshScope注解和定时任务@Scheduled注解同时使用导致失效问题

RefreshScope和Scheduled的组合使用有时会导致Scheduled任务失效&#xff0c;主要是由于它们在Spring中的工作机制不同。 RefreshScope的工作原理 RefreshScope是Spring Cloud中的一个注解&#xff0c;它允许在应用运行时刷新bean的属性&#xff0c;而不需要重启应用程序。具…

美国空军发布类ChatGPT产品—NIPRGPT

6月11日&#xff0c;美国空军研究实验室&#xff08;AFRL&#xff09;官网消息&#xff0c;空军部已经发布了一款生成式AI产品NIPRGPT。 据悉&#xff0c;NIPRGPT是一款类ChatGPT产品&#xff0c;可生成文本、代码、摘要等内容&#xff0c;主要为为飞行员、文职人员和承包商提…