当前位置: 首页 > news >正文

代码随想录算法训练营第六十二天| prim算法,kruskal算法

训练营六十二天打卡,图论比较难,坚持下来胜利就在眼前!


53.卡码网【寻宝】

题目链接

解题过程

  • 没做过类似的题目,跟着答案敲了一遍
  • 最小生成树 可以使用 prim算法 也可以使用 kruskal算法计算出来。
  • prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。
  • prim算法核心就是三步,prim三部曲
    1. 第一步,选距离生成树最近节点
    2. 第二步,最近节点加入生成树
    3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)
  • minDist数组 用来记录 每一个节点距离最小生成树的最近距离

prim算法

#include<iostream>
#include<vector>
#include<climits>
using namespace std;int main() {int v, e;cin >> v >> e;vector<vector<int>>grid(v + 1, vector<int>(v + 1, 10001));while (e--) {int x, y, val;cin >> x >> y >> val;grid[x][y] = grid[y][x] = val;}vector<int>minDist(v + 1, 10001);vector<bool>isInTree(v + 1, false);for (int i = 1; i < v; i++) { // v - 1条边int cur = -1;int minVal = INT_MAX;for (int j = 1; j <= v; j++) {if (!isInTree[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}isInTree[cur] = true;for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}int result = 0;for (int i = 2; i <= v; i++) {result += minDist[i];}cout << result << endl;return 0;
}
  • prim 算法是维护节点的集合,而 Kruskal 是维护边的集合
  • kruscal的思路:
    • 边的权值排序,因为要优先选最小的边加入到生成树里
    • 遍历排序后的边
      • 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
      • 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合
  • 将两个节点加入同一个集合,又如何判断两个节点是否在同一个集合呢
    • 答案是并查集
    • 并查集主要就两个功能:
      • 将两个元素添加到一个集合中
      • 判断两个元素在不在同一个集合

Kruskal算法

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Edge{int l, r, val;
}; // l r 为边,val为边的数值
vector<int>father;
void init(int v) {father.resize(v + 1);for (int i = 0; i <= v; 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);v = find(v);if (u != v) {father[v] = u;}
}int main() {int v, e;cin >> v >> e;init(v);vector<Edge>edges;while (e--) {int l, r, val;cin >> l >> r >> val;Edge edge;edge.l = l;edge.r = r;edge.val = val;edges.push_back(edge);}sort(edges.begin(), edges.end(), [](Edge& e1, Edge& e2)->bool{return e1.val < e2.val;});int result = 0;for (Edge edge : edges) {int x = find(edge.l);int y = find(edge.r);if (x != y) {result += edge.val;join(x, y);}}cout << result << endl;return 0;
}

相关文章:

代码随想录算法训练营第六十二天| prim算法,kruskal算法

训练营六十二天打卡&#xff0c;图论比较难&#xff0c;坚持下来胜利就在眼前&#xff01; 53.卡码网【寻宝】 题目链接 解题过程 没做过类似的题目&#xff0c;跟着答案敲了一遍最小生成树 可以使用 prim算法 也可以使用 kruskal算法计算出来。prim算法 是从节点的角度 采用…...

Newstar_week1_week2_wp

week1 wp crypto 一眼秒了 n费马分解再rsa flag&#xff1a; import libnum import gmpy2 from Crypto.Util.number import * p 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297…...

今天我们研究一段代码(异或位运算)

let a 18 // 甲 let b 20 // 乙a a ^ b b a ^ b a a ^ b console.log("a",a) // a 20 console.log("b",b) // b 18今天我们就研究上面这一段代码&#xff0c;简单解释一下&#xff0c;初始化一个a 18 b 20&#xff0c; 中间经过了三次的异或之后…...

pycharm中使用ctrl+鼠标滚轮改变字体大小

文章目录 pycharm使用ctrl鼠标滚轮改变字体大小1.打开pycharm选择file2.选择setting4.选择keymap&#xff0c;然后再右边的输入框中输入increase进行增大字体4.鼠标选择后&#xff0c;点击添加鼠标快捷方式&#xff0c;然后设置鼠标滚轮往上增大字体。5.设置缩小字体&#xff0…...

【算法-动态规划】打家劫舍专题

文章目录 1.打家劫舍1.1一维数组1.2三变量法1.3双数组法 2.打家劫舍22.1双数组法2.2 三变量法 3.打家劫舍33.1动态规划3.2双变量法 4.删除相邻数字的最大分数4.1双状态数组4.2一维数组4.3三变量法 1.打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 1.1一维数…...

关于技术管理者的一些思考

前 言 在软件开发领域&#xff0c;当一名资深工程师有机会成为一名技术管理者的时候&#xff0c;通常他/她的反应是什么&#xff1f;兴奋、担扰、无奈还是推托&#xff0c;具体是什么心情也许对结果并不重要&#xff0c;更加重要是在一刻&#xff0c;我们一定要问问我们内心的…...

Alpha-CLIP: A CLIP Model Focusing on Wherever You Want CVPR 2024

在原始的接受RGB三通道输入的CLIP模型的上额外增加了一个alpha通道。在千万量级的RGBA-region的图像文本对上进行训练后&#xff0c;Alpha-CLIP可以在保证CLIP原始感知能力的前提下&#xff0c;关注到任意指定区域。 GitHub - SunzeY/AlphaCLIP: [CVPR 2024] Alpha-CLIP: A CLI…...

Golang | Leetcode Golang题解之第495题提莫攻击

题目&#xff1a; 题解&#xff1a; func findPoisonedDuration(timeSeries []int, duration int) (ans int) {expired : 0for _, t : range timeSeries {if t > expired {ans duration} else {ans t duration - expired}expired t duration}return }...

04 go语言(golang) - 变量和赋值过程

变量 在Go语言中&#xff0c;变量的定义和初始化是编程的基础部分。Go提供了多种方式来声明和初始化变量&#xff0c;以适应不同的使用场景。 基本变量声明 使用var关键字&#xff1a; 使用var关键字可以在函数内部或外部声明变量。如果在函数外部声明&#xff0c;该变量为全…...

语言/图像/视频模型一网打尽!BigModel大模型开放平台助力开发者轻松打造AI新应用!

2024年8⽉28⽇&#xff0c;在ACM SIGKDD&#xff08;国际数据挖掘与知识发现⼤会&#xff0c;KDD&#xff09;上会议现场&#xff0c;智谱AI重磅推出了新⼀代全⾃研基座⼤模型 GLM-4-Plus、图像/视频理解模型 GLM-4V-Plus 和⽂⽣图模型 CogView3-Plus。这些新模型&#xff0c;已…...

Go语言Linux环境搭建以编写第一个Go程序

目录 文章目录 目录Go语言入门1、说明2、CentOS7安装Go3、编写第一个程序3.1、编写程序3.2、运行程序3.3、生成二进制文件4、编写第一个web程序4.1、编写代码4.2、运行程序4.3、测试访问4.4、生成二进制配置Vim-go语法高亮1)、下载和设置Vundle.vim(vim安装插件的工具)2)、…...

使用 Go 构建一个最小的 API 应用

最近有项目要使用 Go 开发&#xff0c;作为一个. NET Core 选手&#xff0c;准备先撸一个包含 CRUD 的最小 MVP 项目练手。 要创建一个 TODO 应用&#xff0c;会创建下面这些接口&#xff1a; APIDescriptionRequest bodyResponse bodyGET /todoitemsGet all to-do itemsNone…...

MySQL 日常维护指南:常见任务、频率及问题解决

MySQL 作为一种广泛使用的开源关系型数据库&#xff0c;随着数据量和应用复杂性的增加&#xff0c;定期的数据库维护对于保持系统高效运行至关重要。通过合理的日常维护&#xff0c;数据库管理员能够确保 MySQL 数据库的稳定性、性能以及数据的完整性。本文将介绍 MySQL 的常见…...

oracle ORA-24920:列大小对于客户机过大

问题描述 在一次读取某个视图数据过程中&#xff0c;当数据读取到x条时&#xff0c;报错ORA-24920&#xff1a;列大小对于客户机过大。 通过查询资料得知&#xff0c;oracle 数据库升级到了12c&#xff0c;VARCHAR2的容量也从4000升级到了32767。 所以猜测某个字段的长度超过4…...

使用 Docker compose 部署 Nacos(达梦数据库)

1. 制作镜像的源码地址 https://github.com/wangsilingwsl/nacos-dm.git 参考的开源项目&#xff1a;https://github.com/jeecgboot/JeecgBoot/tree/master/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos &#xff08;master分支&#xff1b;tag&#xff1a;v3.7.1&#…...

人工智能 | 阿里通义千问大模型

简介 通义千问系列模型为阿里云研发的大语言模型。千问模型基于 Transformer 架构&#xff0c;在超大规模的预训练数据上进行训练得到。预训练数据类型多样&#xff0c;覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。同时&#xff0c;在预训练模型的基础之上&…...

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。...

java防止表单重复提交的注解@RepeatSubmit

代码解释 RepeatSubmit 是一个自定义注解&#xff0c;通常用于防止表单重复提交。这个注解可以应用于控制器方法上&#xff0c;以确保同一个请求在一定时间内不会被多次提交。以下是一些常见的参数和用法&#xff1a; value: 注解的名称或描述。 interval: 两次请求之间的最小间…...

HTTP快速入门

HTTP报文结构 HTTP 协议主要由三大部分组成&#xff1a; ● 起始行&#xff08;start line&#xff09;&#xff1a;描述请求或响应的基本信息&#xff1b; ● 头部字段&#xff08;header&#xff09;&#xff1a;使用 key-value 形式更详细地说明报文&#xff1b; ● 消息正…...

Nacos简介

Nacos是一个开源的动态服务发现、配置管理和服务管理平台&#xff0c;由阿里巴巴集团开发并开源。它提供了服务注册与发现、配置管理、动态DNS服务、服务健康监测、权重和流量管理等核心特性&#xff0c;非常适合构建云原生应用和微服务架构。 Nacos的核心功能包括&#xff1a…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...