算法日记20:SC72最小生成树(prim朴素算法)
一、题目:

二、题解

2.1:朴素prim的步骤解析 O ( n 2 ) O(n^2) O(n2)(n<=1e3)
0、假设,我们现在有这样一个有权图

1、我们随便找一个点,作为起点开始构建最小生成树(一般是1号),并且存入intree[]状态数组中(该数组表示是否访问过了)

2、找所有点当中,距离intree[]最近的点,
- 循环 n − 1 n-1 n−1次(因为已经确定了1这个点),每次找距离
intree[]最近的点作为拓展点, - 即选择了
[2]这个点

3、把dis[2](2距离intree的距离)累计起来(res+=dis[2]),并且更新所有点的dis值

4、此时,重复找所有点当中,距离intree[]最近的点(重复2/3)…
三、朴素prim代码解析
3.1、代码分块解析:
这段代码实现了 Prim 算法 用于求解 最小生成树,我会将代码分块并逐步解释每一块的作用。
1. 常量定义
const int N = 103; // 设置最大点数
int a[N][N], dis[N];
bool st[N];
int n, m;
解释:
N定义了图中点的最大数量,设置为 103。a[N][N]:一个二维数组,表示图的邻接矩阵,存储两点之间的边权。a[i][j]:表示i–>j的距离
dis[N]:一个一维数组,表示从起始点到每个节点的最短距离。st[N]:布尔型数组,用来标记某个节点是否已经被加入最小生成树。(图解中的intree数组)n和m:分别表示图中的节点数和边数。
2. solve 函数的初始化
void solve()
{memset(dis, 0x3f, sizeof(dis)); // 初始化dis数组,设为最大值memset(a, 0x3f, sizeof(a)); // 初始化邻接矩阵为最大值// 初始化cin >> n >> m;for (int i = 1; i <= m; i++) {int ui, vi, wi;cin >> ui >> vi >> wi; a[ui][vi] = min(a[ui][vi], wi);a[vi][ui] = min(a[vi][ui], wi);}for (int i = 1; i <= n; i++) a[i][i] = 0; // 自己到自己没有边,权重为 0
解释:
memset(dis, 0x3f, sizeof(dis)):将dis数组初始化为一个较大的值(通常为无穷大,表示尚未连接的节点)。memset(a, 0x3f, sizeof(a)):将邻接矩阵a初始化为无穷大,表示两点之间如果没有边,则权重为无穷大。- 输入节点数
n和边数m,然后读入每条边的信息,更新邻接矩阵a。同时,因为有可能存在重复边,所以采用min取最小边权,确保保存的是权重最小的边。 - 设置每个节点到自身的距离为
0。
3. 最小生成树的 Prim 算法核心部分
dis[1] = 0; // 从节点1开始,初始权重为0int res = 0; // 记录最小生成树的总权重for (int i = 1; i <= n; i++) // 进行n次选择最小值操作{ int temp = -1; // 用于记录当前最小值对应的节点// 遍历所有节点,找出距离最小的未加入最小生成树的节点for (int j = 1; j <= n; j++) { //和Dijkstra一样,//1.当j这个点还没访问过,2.遍历的的点j<当前点temp的距离,那么就更新temp//temp==-1只是为了确保其能够第一次进入循环,详解看Dijkstraif (!st[j] && ((temp == -1) || (dis[j] < dis[temp]))) {temp = j;}}//此时temp就是距离intree最近的点if (temp == -1) // 如果所有节点都已经被选中,说明图不连通,直接return{ cout << -1 << '\n';return; }
解释:
- 初始化
dis[1] = 0,表示从节点1开始构建最小生成树,起始点的距离为0。 res用来记录最小生成树的总权重。- 外层
for (int i = 1; i <= n; i++)进行n次选择最小值操作,每次选择一个最小的未加入最小生成树的节点。 - 内层循环
for (int j = 1; j <= n; j++)遍历所有节点,找出距离当前生成树最近的节点。条件是节点未加入生成树!st[j]且dis[j]小于当前最小值。 temp == -1用来判断是否图不连通。如果没有找到最小值节点,说明图是断开的,输出-1。
4. 更新最小生成树的权重并松弛边
res += dis[temp]; // 将当前最小值加到结果中st[temp] = true; // 标记节点temp已加入最小生成树dis[temp] = 0; // 当前节点到自己的距离设为0(实际上不影响结果)for (int i = 1; i <= n; i++) { // 松弛与temp相连的所有边if (!st[i]) { // 只有未加入最小生成树的节点才能被松弛dis[i] = min(dis[i], a[temp][i]);} } }cout << res << '\n'; // 输出最小生成树的总权重
}
解释:
- 将选中的最小值节点
temp的距离dis[temp]加到总权重res中。 - 标记该节点已经被加入最小生成树,即
st[temp] = true。 - 进行 松弛操作,尝试更新与当前最小值节点相连的所有边的权重,更新未加入生成树的节点的最短距离
dis[i]。
3.2、完整代码
#include<bits/stdc++.h>
using namespace std;const int N=103;
struct node{int v;//指向点int w;//权重
};
int a[N][N],dis[N];
bool st[N];
int n,m;void solve()
{memset(dis,0x3f,sizeof(dis));memset(a,0x3f,sizeof(a));//初始化cin>>n>>m;for(int i=1;i<=m;i++){int ui,vi,wi;cin>>ui>>vi>>wi; //g[ui].push_back({vi,wi});a[ui][vi]=min(a[ui][vi],wi);a[vi][ui]=min(a[vi][ui],wi);}for(int i=1;i<=n;i++) a[i][i]=0;dis[1]=0; //从1开始,1的权重为0int res=0;for(int i=1;i<=n;i++) //找n次最小值{int temp=-1; //表示dis最小点for(int j=1;j<=n;j++) //遍历每个点找最小值{//如果j还没被选中过if(!st[j] && ((temp==-1)||(dis[j]<dis[temp]))){temp=j;}}if (temp == -1) // 如果没有点可选,说明图不连通{cout<<-1<<'\n';break; }//此时表示已经选中了最小值tempres+=dis[temp];st[temp]=true;dis[temp]=0;//距离设置为0for(int i=1;i<=n;i++) //松弛temp相连的边a[temp][i]{if(!st[i]) //表示i话没有松弛过{dis[i]=min(dis[i],a[temp][i]);} } }cout<<res<<'\n';
} int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;while(_--) solve();return 0;
}
相关文章:
算法日记20:SC72最小生成树(prim朴素算法)
一、题目: 二、题解 2.1:朴素prim的步骤解析 O ( n 2 ) O(n^2) O(n2)(n<1e3) 0、假设,我们现在有这样一个有权图 1、我们随便找一个点,作为起点开始构建最小生成树(一般是1号),并且存入intree[]状态数组中…...
玩转SpringCloud Stream
背景及痛点 现如今消息中间件(MQ)在互联网项目中被广泛的应用,特别是大数据行业应用的特别的多,现在市面上也流行这多个消息中间件框架,比如ActiveMQ、RabbitMQ、RocketMQ、Kafka等,这些消息中间件各有各的优劣,但是想…...
嵌入式经常用到串口,如何判断串口数据接收完成?
说起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu(如:stm32f103)在出厂时就已经在…...
iOS App的启动与优化
App的启动流程 App启动分为冷启动和热启动 冷启动:从0开始启动App热启动:App已经在内存中,但是后台还挂着,再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段: dyld:…...
导出指定文件夹下的文件结构 工具模块-Python
python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…...
Leetcode - 周赛436
目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举,在确定了每一个对角线的第一个元素…...
【pytest】编写自动化测试用例命名规范README
API_autoTest 项目介绍 1. pytest命名规范 测试文件: 文件名需要以 test_ 开头或者以 _test.py 结尾。例如,test_login.py、user_management_test.py 这样的命名方式,pytest 能够自动识别并将其作为测试文件来执行其中的测试用例。 测试类…...
Compose常用UI组件
Compose常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件常用布局组件列表组件 概述 Compose 预置了很多基础组件,如 Button,TextField,TopAppBar等&a…...
斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
文章目录 引言递归与动态规划的对比递归解法的初探动态规划的优雅与高效自顶向下的记忆化搜索自底向上的迭代法 性能分析与比较小结 引言 斐波那契数列,这一数列如同一条无形的丝线,穿越千年时光,悄然延续其魅力。其定义简单而优美ÿ…...
Hackthebox- Season7- Titanic 简记 [Easy]
简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…...
Sa-Token 根据官方文档简单实现登录认证的示例
Sa-Token 根据官方文档实现登录鉴权测试 功能实现步骤依赖配置文件启动类创建 controller启动项目测试不用密码登录查看cookie状态 密码登录查看cookie状态 修改token名称 Apipost 测试无 cookie 模式【使用 token】后端将 token 返回到前端修改代码:测试࿱…...
rustdesk编译修改名字
最近,我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。 为什么要重写? 这个模块2W行代码量看起来不多,却在线上时常故障,永远改不完。…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...
【运维】源码编译安装cmake
背景: 已经在本地源码编译安装gcc/g,现在源码安装cmake 下载源码 下载地址:CMake - Upgrade Your Software Build System 安装步骤: ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…...
检测网络安全漏洞 工具
实验一的名称为信息收集和漏洞扫描 实验环境:VMware下的kali linux2021和Windows7 32,网络设置均为NAT,这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录: 1.信息收集的步骤 2.ping命令…...
frameworks 之 Activity添加View
frameworks 之 Activity添加View 1 LaunchActivityItem1.1 Activity 创建1.2 PhoneWindow 创建1.3 DecorView 创建 2 ResumeActivityItem 讲解 Activity加载View的时机和流程 涉及到的类如下 frameworks/base/core/java/android/app/Activity.javaframeworks/base/services/cor…...
UWB技术中的两种调制方式:PPM与PAM
Ultra-Wideband (UWB) 技术以其低功耗、宽频谱和高精度定位的特点,广泛应用于物联网(IoT)、智能家居、资产追踪和无线通信等领域。在UWB中,信号的调制方式对于数据传输的效率和精度起着至关重要的作用。本文将深入探讨UWB中常用的…...
达梦:用户和模式
目录标题 数据库管理系统与用户权限管理**四权分立****用户管理与权限划分****用户管理界面与权限控制****用户创建与管理****实操**1. **默认创建用户与模式**:2. **用户权限和角色分配**:3. **命令行管理用户与角色**:4. 模式也可以创建 **…...
23. AI-大语言模型-DeepSeek
文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…...
Spring-GPT智谱清言AI项目(附源码)
一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
IP选择注意事项
IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...
