备战2023蓝桥国赛-重新理解Prim和Kruskal算法

news2025/2/28 17:38:03

备战2023蓝桥国赛-重新理解Prim和Kruskal算法

  • Prim算法
  • Kruskal算法

Prim算法

题目描述:
在这里插入图片描述
在这里插入图片描述
解析:
prim算法跟dijkstra的朴素解法有很多相像部分,他们都是枚举中继节点来更新下一个节点,都是选最小的dist值来更新,时间复杂度都是O(n✖n)。

不同之处在于:
dijkstra的dist[i]表示1号点到i号点的最小距离,而prim的dist[i]表示用来更新dist[i]的中继节点与i点的最小距离。

所以prim算法每次更新时都会加上dist[t],然后通过dist[t]来更新与之相连的节点的dist值。

那么为什么这样做可以算出最小生成树呢?
因为每次求出最小的dist[t]时,就代表着求出了用来更新dist[t]的中继节点与t点之间的最小值,又由于中继节点用完了就不能用了,如此循环n次就能求出最小生成树了。

代码:


#include<bits/stdc++.h>
using namespace std;
const int N=510,INF=0x3f3f3f3f;
int n,m,g[N][N],dist[N],st[N];
int prim()
{
	memset(dist,0x3f,sizeof(dist));
	int res=0;
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
		{
			if(!st[j]&&(t==-1||dist[t]>dist[j]))
			t=j;
		}
		if(i&&dist[t]==INF) return INF;
		if(i) res+=dist[t];
		for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
		st[t]=1;
	}
	return res;
}
int main()
{
	scanf("%d%d",&n,&m);
	memset(g,0x3f,sizeof(g));
	while(m--)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		g[u][v]=g[v][u]=min(g[u][v],w);
	}
	int t=prim();
	if(t==INF) printf("impossible");
	else printf("%d",t);
	return 0;
}

Kruskal算法

题目描述:
在这里插入图片描述
在这里插入图片描述
解析:
Kruskal算法跟dijkstra的堆优化版有点类似,都是枚举边,但写法上有很大不同,dijkstra是用单链表来存边的,Kruskal则是用结构体来存,而且枚举边的方法也有很大的不同,Kruskal单纯地从小到大枚举边,而堆优化版的dijkstra则是用到了优先队列来存边和点,然后从中选最小的dist值,情况更复杂;

当然,由于题目性质不同,这两个解法肯定不同,接下来就说Kruskal的具体解法:
先是用结构体存边,再对边进行从小到大的排序,然后枚举边,判断边上的两个节点是否在同一个连通块里,不在就把他们连起来,res加上边的值,cnt++(res用来统计权值之和,cnt用来统计连通块中边的数目),如此循环m次,判断cnt是否等于n-1,是则能求出最小生成树,否则就不存在。

那么为什么这种解法可以求出最小生成树呢?
因为每次循环,如果两个点不在同一个连通块里,就能确定两个点之间的最小值,如此循环m次,如果存在最小生成树的话,就一定能求出能将所有点相连的具有n个点,n-1条边的生成树,而且是最小的。

代码:

#include<bits/stdc++.h>
using namespace std;
const int M=2e5+10,N=1e5+10,INF=0x3f3f3f3f;
int n,m,p[N];
struct node{
	int a,b,w;
}edges[M];
int find(int x){
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}
bool cmp(node x,node y)
{
	return x.w<y.w;
}
int kruskal()
{
	sort(edges,edges+m,cmp);
	
	for(int i=1;i<=n;i++) p[i]=i;
	
	int res=0,cnt=0;
	for(int i=0;i<m;i++)
	{
		int a=edges[i].a,b=edges[i].b,w=edges[i].w;
		a=find(a),b=find(b);
		if(a!=b)
		{
			p[a]=b;
			res+=w;
			cnt++; 
		}
	}
	if(cnt==n-1) return res;
	else return INF;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		edges[i]={a,b,w};
	}
	int t=kruskal();
	if(t==INF) printf("impossible");
	else printf("%d",t);
}

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

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

相关文章

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

【网页设计】期末大作业html+css(动漫网站)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【机器学习项目实战10例】(十):DataCastle-租金预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、DataCastle-租金预测二、数据集介绍三、导入相关库四、读取数据五、删除缺失值过多的列六、填补缺失数据七、特征编码八、简单跑一下九、可视化数据分布9.1 箱线图9.2 直方图和Q-Q图一、DataCastle-租金预测 本项目任务…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理

文章目录 1.概述2.xx3.工作原理3.1初始状态3.2中间状态3.2.1顺序执行3.2.2发生跳转.2.3特殊情况: new对象3.3结束状态4.示例:打印方法的Frame4.2 编码实现5.总结1.概述 在上一篇文章: 【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍 我们知道 AnalyzerAdapter 主…

Android开发java调用C简单示例

目录下载NDK和CMake新建NDK项目写入C代码&#xff0c;并运行本文使用的Android Studio版本是windows版Android Studio Bumblebee | 2021.1.1 Patch 2 先看下最终效果&#xff1a; 下载NDK和CMake 检查NDK和CMake是否已经下载了&#xff0c;这一步不难&#xff0c;具体步骤就…

工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64

GLG Toolkit是为开发高级图形的动态界面而设计的框架&#xff1a;不只是简单的按钮和选单&#xff0c;而且是完全动画的图形对象&#xff0c;它能够显示动态数据和作出与用户交互的反应。它不仅是一个能够创建很多“漂亮的图片”绘图工具&#xff0c;而且它的图形引擎允许开发人…

Spring Boot 使用Docker构建运行

Docker 容器化 Spring Boot 应用 在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序&#xff0c;从最简单的Dockerfile开始&#xff0c;一步步的学习Docker 容器的使用过程。 Spring Boot 应用系统 创建项目 使用…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-3 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-3 平面机构离散运动鞍点综合2.4 鞍滑点2.4.1 鞍线与二副连架杆P-R2.4.2 鞍线误差2.4.3 三位置鞍线2.4.4 四位置鞍线2.4 鞍滑点 在平面机构运动综合时&#xff…

实验七 循环神经网络(2)梯度爆炸实验

目录6.2 梯度爆炸实验6.2.1 梯度打印函数【思考】什么是范数&#xff0c;什么是L2范数&#xff0c;这里为什么要打印梯度范数&#xff1f;6.2.2 复现梯度爆炸现象6.2.3 使用梯度截断解决梯度爆炸问题【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f;6.2 梯度爆炸实…

基于遗传算法的风电储能蓄电池容量优化配置matlab优化程序

基于遗传算法的风电储能蓄电池容量优化配置 风电储能蓄电池微电网配置&#xff08;基于matlab的遗传算法微电网配置优化程序&#xff09; 参考文献&#xff1a;基于遗传算法的风电储能蓄电池容量优化配置 摘要&#xff1a;为了降低独立风力发电系统中储能装置的生命周期费用&a…

【数据物语系列】 漫谈数据分布可视化分析

【数据物语系列】 漫谈数据分布可视化分析 FesianXu 20221125 at Baidu Search Team 前言 在实际工作中&#xff0c;我们经常会遇到一堆数据&#xff0c;对数据的有效分析至为关键&#xff0c;而数据的分布就是一种非常重要的数据属性&#xff0c;需要通过合适的可视化手段进行…

【创建springboot-maven项目搭建mybatis框架】(超详细)

目录 1. 创建Spring Boot项目&#xff0c;相关参数 2. 创建数据库 3. 在IntelliJ IDEA中配置Database面板 4. 添加数据库编程的依赖 5. 关于Mybatis框架 6. Mybatis编程&#xff1a;插入相册数据 1. 创建Spring Boot项目&#xff0c;相关参数 项目名称&#xff1a;csmall…

[附源码]java毕业设计中小企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

javaEE飞机航班信息查询网站系统

本系统主要包含了订票管理、航班信息管理、站内新闻管理、活动信息管理、用户信息管理、留言等多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统后台对本系统其他管理模块进行管理。 添加管理员模块&#xff1a;向本系统中…

UE5笔记【十】第一个蓝图项目:bluePrint。

我们将上升的斜坡或者楼梯隐藏&#xff0c;往下移动&#xff0c;使其隐藏在地面以下。然后将方块也向下移动&#xff0c;漏出一点来。我们要模拟的场景是&#xff1a;当人移动到蓝色方块上时&#xff0c;踩在方块上&#xff0c;上升的楼梯升起来。然后人可以上楼。 将蓝色方块…

HTML静态网页作业——电影介绍-你的名字 5页 无js 带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

基于双层优化的微电网系统规划设计方法matlab程序(yalmip+cplex)

基于双层优化的微电网系统规划设计方法matlab程序&#xff08;yalmipcplex&#xff09; 参考文献&#xff1a;基于双层优化的微电网系统规划设计方法 摘要&#xff1a;规划设计是微电网系统核心技术体系之一。从分布式电源的综合优化(组合优化、容量优化)和分布式电源间的调度…

【虚幻引擎UE】UE5 两种球体绘制方法

一、网格球体绘制 center 中心点向量 segments参数越大&#xff0c;线条越多 radius是球体半径 thickness 厚度可以不用管 Depth Priority 是渲染深度可以不用管 F Life Time 是持续时间 C代码如下—— .cpp #include "drawBallFunc.h" #include "Components…

机器学习中的数学基础(二)

机器学习中的数学基础&#xff08;二&#xff09;2 线代2.1 矩阵2.2 矩阵的秩2.3 内积与正交2.4 特征值与特征向量2.5 SVD矩阵分解2.5.1 要解决的问题2.5.2 基变换2.5.3 特征值分解2.5.4 奇异值分解&#xff08;SVD&#xff09;在看西瓜书的时候有些地方的数学推导&#xff08;…

使用redis快速实现session共享,springboot

1.引入依赖 <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId> </dependency> <!-- 引入 redis 依赖 --> <dependency><groupId>org.springframework.b…