Day62||prim算法精讲 |kruskal算法精讲
prim算法精讲
53. 寻宝(第七期模拟笔试)
题目描述
在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。
不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。
给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。
输入描述
第一行包含两个整数V 和 E,V代表顶点数,E代表边数 。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。
接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。
输出描述
输出联通所有岛屿的最小路径总距离
输入示例
7 11 1 2 1 1 3 1 1 5 2 2 6 1 2 4 2 2 3 2 3 4 1 4 5 1 5 6 2 5 7 1 6 7 1
输出示例
6
提示信息
数据范围:
2 <= V <= 10000;
1 <= E <= 100000;
0 <= val <= 10000;如下图,可见将所有的顶点都访问一遍,总距离最低是6.
最小生成树的模板题。
最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。
prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。
prim算法核心就是三步,我称为prim三部曲
- 第一步,选距离生成树最近节点
- 第二步,最近节点加入生成树
- 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)
minDist数组 用来记录 每一个节点距离最小生成树的最近距离。
1.初始状态
minDist 数组 里的数值初始化为 最大数
2.
1.选距离生成树最近节点,任取一点就可以
2.最近节点加入生成树
3.
更新非生成树节点到生成树的距离(即更新minDist数组)
接下来,我们要更新所有节点距离最小生成树的距离,如图:
然后第二步选节点2或3都行,依据三部曲执行过程。不断更新mindist值
流程
选择节点2
选择节点3
选择离最小生成树的最近节点4
选择5
选6
最后选7
最后,累加mindist的等于1的值,就是最小生成树的权重总和。
代码
邻接矩阵。节点对应的边的关系。
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main()
{int v,e;//点和边的数量int x,y,k;//起点,终点,边的权重cin>>v>>e;//声明一个大小为 (v + 1) x (v + 1) 的二维向量 grid,用于存储图的邻接矩阵。初始值为10001,表示不存在的边或非常大的权值。vector<vector<int>>grid(v+1,vector<int>(v+1,10001));//读取边构建邻接矩阵while(e--){cin>>x>>y>>k;//因为图是无向的,所以两个方向的权重都设置为 k。grid[x][y]=k;grid[y][x]=k;}vector<int>minDist(v+1,10001);//用于存储每个节点到最小生成树的最小距离vector<int>isintree(v+1,false);//用于标记每个节点是否已经加入最小生成树,初始值为 false。//prim算法精华for(int i=1;i<v;i++)//循环 v - 1 次,因为最小生成树需要 v - 1 条边。{//第一步,选距离生成树最近的节点int cur=-1;int minVal=INT_MAX;for(int j=1;j<=v;j++)//1到v{// 选取最小生成树节点的条件:// (1)不在最小生成树里// (2)距离最小生成树最近的节点if(!isintree[j]&&minDist[j]<minVal){minVal=minDist[j];cur=j;//更新最近节点}}//第二步,把最近节点加入生成树中isintree[cur]=true;//第三步,更新mindist值// cur节点加入之后, 最小生成树加入了新的节点,那么所有节点到 最小生成树的距离(即minDist数组)需要更新一下// 由于cur节点是新加入到最小生成树,那么只需要关心与 cur 相连的 非生成树节点 的距离 是否比 原来 非生成树节点到生成树节点的距离更小了呢for(int i=1;i<=v;i++){// 更新的条件:// (1)节点是 非生成树里的节点// (2)与cur相连的某节点的权值 比 该某节点距离最小生成树的距离小if(!isintree[i]&&grid[cur][i]<minDist[i])minDist[i]=grid[cur][i];}}int result=0;//输出生成树权重for(int i=2;i<=v;i++){result+=minDist[i];}cout<<result<<endl;}
模拟运行结果
假设输入如下:
4 6 1 2 1 1 3 2 1 4 3 2 3 4 2 4 5 3 4 6
首先读取
v=4
和e=6
,初始化邻接矩阵grid
。读取边并填充邻接矩阵:
- 边
(1, 2, 1)
,grid[1][2] = 1
,grid[2][1] = 1
- 边
(1, 3, 2)
,grid[1][3] = 2
,grid[3][1] = 2
- 边
(1, 4, 3)
,grid[1][4] = 3
,grid[4][1] = 3
- 边
(2, 3, 4)
,grid[2][3] = 4
,grid[3][2] = 4
- 边
(2, 4, 5)
,grid[2][4] = 5
,grid[4][2] = 5
- 边
(3, 4, 6)
,grid[3][4] = 6
,grid[4][3] = 6
初始化
minDist
和isInTree
。运行 Prim 算法:
- 第一次迭代:选择节点1,更新
minDist
为[10001, 1, 2, 3]
。- 第二次迭代:选择节点2,更新
minDist
为[10001, 1, 2, 3]
。- 第三次迭代:选择节点3,更新
minDist
为[10001, 1, 2, 3]
。统计结果:
result = 1 + 2 + 3 = 6
最终输出:
6
kruskal算法精讲
如上题,这里是另一种解法。
Kruskal 是维护边的集合。
kruscal的思路:
- 边的权值排序,因为要优先选最小的边加入到生成树里
- 遍历排序后的边
- 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
- 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合
开始从头遍历排序后的边。
选边(1,2),节点1 和 节点2 不在同一个集合,所以生成树可以添加边(1,2),并将 节点1,节点2 放在同一个集合。
选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。
大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行
(这里在强调一下,以下选边是按照上面排序好的边的数组来选择的)
选边(1,3),节点1 和 节点3 不在同一个集合,生成树添加边(1,3),并将节点1,节点3 放到同一个集合。
选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。
选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。
选边(6,7),节点6 和 节点7 不在同一个集合,生成树添加边(6,7),并将 节点6,节点7 放到同一个集合。
选边(5,7),节点5 和 节点7 在同一个集合,不做计算。
选边(1,5),两个节点在同一个集合,不做计算。
后面遍历 边(3,2),(2,4),(5,6) 同理,都因两个节点已经在同一集合,不做计算。
此时 我们就已经生成了一个最小生成树,即:
代码
用到并查集。
功能:
- 将两个元素添加到一个集合中
- 判断两个元素在不在同一个集合
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// l,r为 边两边的节点,val为边的数值
struct Edge {int l, r, val;
};// 节点数量
int n = 10001;
// 并查集标记节点关系的数组
vector<int> father(n, -1); // 节点编号是从1开始的,n要大一些// 并查集初始化
void init() {for (int i = 0; i < n; ++i) {father[i] = i;}
}// 并查集的查找操作
int find(int u) {return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}// 并查集的加入集合
void join(int u, int v) {u = find(u); // 寻找u的根v = find(v); // 寻找v的根if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回father[v] = u;
}int main() {int v, e;int v1, v2, val;vector<Edge> edges;int result_val = 0;cin >> v >> e;while (e--) {cin >> v1 >> v2 >> val;edges.push_back({v1, v2, val});}// 执行Kruskal算法// 按边的权值对边进行从小到大排序sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {return a.val < b.val;});// 并查集初始化init();// 从头开始遍历边for (Edge edge : edges) {// 并查集,搜出两个节点的祖先int x = find(edge.l);int y = find(edge.r);// 如果祖先不同,则不在同一个集合if (x != y) {result_val += edge.val; // 这条边可以作为生成树的边join(x, y); // 两个节点加入到同一个集合}}cout << result_val << endl;return 0;
}
模拟运行结果
假设输入如下:
4 6 1 2 1 1 3 2 1 4 3 2 3 4 2 4 5 3 4 6
首先读取
v=4
和e=6
,初始化father
数组。读取边并存储在
edges
中:
- 边
(1, 2, 1)
- 边
(1, 3, 2)
- 边
(1, 4, 3)
- 边
(2, 3, 4)
- 边
(2, 4, 5)
- 边
(3, 4, 6)
按边的权重从小到大排序:
- 边
(1, 2, 1)
- 边
(1, 3, 2)
- 边
(1, 4, 3)
- 边
(2, 3, 4)
- 边
(2, 4, 5)
- 边
(3, 4, 6)
初始化并查集。
遍历排序后的边:
- 边
(1, 2, 1)
:1
和2
不在同一个集合,加入生成树,result_val = 1
。- 边
(1, 3, 2)
:1
和3
不在同一个集合,加入生成树,result_val = 3
。- 边
(1, 4, 3)
:1
和4
不在同一个集合,加入生成树,result_val = 6
。- 边
(2, 3, 4)
:2
和3
在同一个集合,跳过。- 边
(2, 4, 5)
:2
和4
在同一个集合,跳过。- 边
(3, 4, 6)
:3
和4
在同一个集合,跳过。最终输出:
6
相关文章:

Day62||prim算法精讲 |kruskal算法精讲
prim算法精讲 53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同&…...

upload-labs通关练习
目录 环境搭建 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 第九关 第十关 第十一关 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 总结 环境搭建 upload-labs是一个使用php语言编写的,…...

wordpress搭建主题可配置json
网站首页展示 在线访问链接 http://dahua.bloggo.chat/ 配置json文件 我使用的是argon主题,你需要先安装好主题,然后可以导入我的json文件一键配置。 需要json界面配置文件的,可以在评论区回复,看见评论我会私发给你。~...

RWKV-5/6 论文被 COLM 2024 收录
由 Bo PENG 和 RWKV 开源社区共同完成的 RWKV-5/6架构论文《Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence》被顶级会议 COLM 2024 收录。 这是继 RWKV-4 架构论文《RWKV: Reinventing RNNs for the Transformer Era》被 EMNLP 2023 收录之后&…...
MinIO分片下载超大文件
一、前言 各位亲爱的们,之前介绍过了上传超大文件到MinIO: MinIO分片上传超大文件(纯服务端)MinIO分片上传超大文件(非纯服务端) 这里最后再补充一下从MinIO下载超大文件。 二、从MinIO分片下载大文件 …...
Vue3 -- 新组件【谁学谁真香系列6】
Teleport Teleport是什么?–Teleport是一种能够将我们的组件html结构移动到指定位置的技术。 父组件: <template><div calss="outer"><h2>我是App组件</h2><img src="https://z1.ax1x.com/2023/11/19/piNxLo4.jpg" alt=&qu…...

Openstack3--本地仓库搭建(ftp源搭建失败)
上传镜像 后面的ftp源做不了,请将下面的本地openstack源在控制节点和计算节点都配置 在控制节点上传,安装ftp并配置启动后再在计算节点配置 将openStack-train.iso文件通过MobaXterm远程连接软件上传至控制节点 /opt 目录下 挂载 进入 /opt 目录 创建…...

【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
文章目录 一、移除链表元素思路一思路二 二、合并两个有序链表思路:优化: 三、反转链表思路一思路二 四、链表的中间节点思路一思路二 五、综合应用之链表的回文结构思路一:思路二: 一、移除链表元素 题目链接:https:…...

【PGCCC】Postgresql Toast 原理
前言 上篇博客讲述了 postgresql 如何存储变长数据,它的应用主要是在 toast 。Toast 在存储大型数据时,会将它存储在单独的表中(称为 toast 表)。因为 postgresql 的 tuple(行数据)是存在在 Page 中的&…...

vue3使用element-plus,树组件el-tree增加引导线
vue3使用element-plus,树组件el-tree增加引导线 vue3项目element-plus,树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求,UI图,所以对el-tree进行增加了引导线 修改样式如下&am…...

AlphaFold3中文使用说明
目录 1. 在线网站用例1. 使用json输入预测蛋白结构 2. 本地命令行2.1 运行示例2.2 AF3输入输入格式JSON兼容性JSON最外层(Top-level)结构序列多序列比对MSA结构模板键 用户提供CCDs 2.3 AF3输出 AlphaFold3(AF3)可以通过在线网站或…...

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
前言 假设您正在现有项目中集成这些包,而该项目的构建工具为 Webpack 或 Vite。同时,您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法,请随时留言。 安装 npm install three types/three react-three/fiber rea…...

Koa进阶:掌握中间件和参数校验的艺术
目录 一、首先下载依赖 二、在index.js中引入koa-parameter,一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同,返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…...

开源共建 | 长安链开发常见问题及规避
长安链开源社区鼓励社区成员参与社区共建,参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中,深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法,相关内容多次解答社区成员…...
【网络】深入理解 HTTPS:确保数据传输安全的核心协议
目录 引言一、HTTPS的基本概念1.1 什么是 HTTPS?1.2 HTTPS 的工作原理1.3 图解:HTTPS 通信过程1.4 HTTPS 与 HTTP 的区别1.5 为什么 HTTPS 更加重要? 二、SSL/TLS协议的核心2.1 SSL/TLS 协议的作用2.2 SSL/TLS 的工作流程2.2.1 握手阶段2.2.2…...

C/C++中使用MYSQL
首先要保证下载好mysql的库和头文件,头文件在/usr/include/mysql/目录下,库在/usr/lib64/mysql/目录下: 一般情况下,在我们安装mysql的时候,这些都提前配置好了,如果没有就重装一下mysql。如果重装mysql还是…...

【GD32】(一) 开发方式简介及标准库开发入门
文章目录 0 前言1 开发方式选择2 标准库模板的创建3 遇到的问题和解决方法 0 前言 因为项目关系,需要使用GD32。之前对此早有耳闻,知道这个是一个STM32的替代品,据说甚至可以直接烧录STM32的程序(一般是同型号)&#x…...
轻松上手:使用Docker部署Java服务
文章目录 1. 什么是Docker?2. 为什么使用Docker部署Java服务?3. 如何使用Docker部署Java服务?步骤1:创建Dockerfile步骤2:构建Docker镜像步骤3:运行Docker容器 4. 注意事项5. 结语推荐阅读文章 在当今的云计…...
wormml_vgg19
创建环境 mamba install libopencv hdf5 -c conda-forge conda create -n st python3.6.2手动导入包 mamba install blas1.0mkl -c conda-forge mamba install hdf51.8.20hac2f561_1 -c conda-forge mamba install libopencv3.4.2h20b85fd_0 -c conda-forge mamba install l…...
Rust学习(二):rust基础语法Ⅰ
Rust学习(二)——rust基础语法Ⅰ: 1、关键字: 了解编程语言的同学都清楚,关键字在一门编程语言中的意义,所谓关键字就是语言的创造者及后续开发者们,以及定义好的具有特殊含义和作用的单词&am…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...