代码随想录算法训练营Day63|最小生成树算法prim和kruskal、kama 53.寻宝

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

最小生成树

        最小生成树(Minimum Spanning Tree,MST)算法是图论中的一个重要概念,它是指在加权无向图中,找到一个边的子集,构成一个树形结构,该子集包含图中所有的顶点,同时保证所有边的权值之和最小。这个构成的树就称为最小生成树。

        常用的最小生成树算法主要有两种:

  1. 普里姆算法(Prim's algorithm):
  • 从图中的一个顶点开始,逐步增加新的边和顶点,直到形成最小生成树。
  • 算法的关键步骤是选择最小的边来扩展当前的树。
  • 该算法适合于边稠密的图。

     2.克鲁斯卡尔算法(Kruskal's algorothm):

  • 他按边的权重顺序(从小到大)选择边,并检查是否加入这条边后会形成环。
  • 如果不会形成换,则将这条边加入到最小生成树中。
  • 该算法适合于边稀疏的图。

        这两种算法能够有效地找到加权无向图的最小生成树,但它们在处理图的顶点和边的关系上有所不同。普里姆算法从顶点出发,而克鲁斯卡尔算法从边出发。

        最小生成树算法在实际应用中非常重要,例如在设计和构建物理网络(如电信网络、计算机网络、道路建设等)时,通过最小生成树算法可以以最小的成本构建出覆盖所有节点的网络结构。此外,它们在许多优化问题中也扮演着关键角色,如电路设计、网络构建等。

寻宝

53. 寻宝(第七期模拟笔试) (kamacoder.com)

prim算法

prim算法的核心有三步

  1. 选距离生成树最近节点
  2. 最近节点加入生成树
  3. 更新非生成树节点到生成树的距离(更新minDist数组)

minDist数组是用来记录每一个节点距离最小生成树的最近距离。

minDist数组的值初始化为最大数,本题初始化为10001(根据题目设定)。

vector<int>minDist(V+1,10001)//共有V个顶点,这里为了与顶点编号对应,数组从1到v,0弃用

第一步需要选距离生成树最近节点,在开始时,并没有生成树,也没有节点,考虑随便加入一个节点(注意对于最小生成树来说,每个节点都是必要的,所以可以随便加入),这里先加入节点1.

然后对与1节点相连的节点,更新minDist数组,即将权赋值到minDist数组上。

之后就是不断选择距离最小生成树最近的节点,加入到最小生成树,更新非生成树节点到生成树的距离,直到最后所有节点都在生成树中,最后对minDist数组的第二位到末尾相加,即为最小权和。

具体步骤详解可以参考代码随想录 (programmercarl.com)

#include<vector>
#include<iostream>
#include<climits>
using namespace std;

int main(){
    int V,E; // V 表示顶点的数量,E 表示边的数量
    cin>>V>>E; // 输入顶点和边的数量

    int x,y,k; // x, y, k 分别表示边的两个顶点和权重
    // 创建一个 V+1 行 V+1 列的二维向量 grid,初始化所有值为 10001(表示无穷大)
    vector<vector<int>>grid(V + 1,vector<int>(V + 1,10001));

    // 读入每条边的信息,并更新 grid 中的权重值
    for(int i = 0; i < E;i++){
        cin >>x>>y>>k; // 输入边的两个顶点和权重
        grid[x][y] = k; // 由于是无向图,所以两个方向的权重相同
        grid[y][x] = k;
    }

    // 初始化两个辅助向量,minDist 用于记录从已选树顶点到每个顶点的最小距离,isInTree 用于标记顶点是否已加入最小生成树
    vector<int> minDist(V + 1, 10001); // 初始化所有最小距离为无穷大
    vector<int> isInTree(V + 1, 0); // 初始化所有顶点都未加入最小生成树

    //Prim 算法的核心部分,选择 V-1 条边加入最小生成树
    for(int i = 1; i < V; i ++){
        int cur = -1; // 当前选择的顶点
        int minVal = INT_MAX; // 从已选树顶点到当前顶点的最小距离,初始化为无穷大

        // 遍历所有顶点,找到未加入树且距离最小的顶点
        for(int j = 1; j <=V;j++){
            if(!isInTree[j] and minDist[j] < minVal){
                minVal = minDist[j];
                cur = j;
            }
        }
        isInTree[cur] = 1; // 将当前顶点标记为已加入最小生成树

        // 更新从已选树顶点到其他顶点的最小距离
        for(int j = 1; j <= V;j++){
            if(!isInTree[j] and grid[cur][j] < minDist[j]){
                minDist[j] = grid[cur][j];
            }
        }
    }

    // 计算最小生成树的总权重
    int result = 0;
    for(int i= 2;i<=V;i++){ // 从 2 开始,因为 1 是起始顶点,其最小距离为 0,不应该计入总权重
        result += minDist[i];
    }
    cout<<result<<endl; // 输出最小生成树的总权重

}

算法的时间复杂度为O(V^2),空间复杂度为O(V^2)。

Kruskal算法

相比于prim算法,Kruskal算法侧重边的权重顺序(从小到大)选择边,并检查加入该边后是否会形成环,若不会形成环,则将这条边加入到最小生成树中。该算法适合于边稀疏的图。

算法的步骤如下:

  1. 排序:将图中的所有边按权重从小到大排序。
  2. 初始化:创建一个森林,其中每个顶点都是一个独立的树。
  3. 选择边:按排序后的顺序选择边,对于每条边(v,w),执行一下操作
    1. 使用一个并查集来检查v和w是否在同一个集合中。
    2. 若v和w不在同一个集合中,则将这条边加入的生成树中,并将v和w所在集合合并
  4. 重复:直到森林F中包含V-1条边,这是森林F就是最小生成树。(连接v个顶点最少需要v-1条边)
  5. 结束:构造最小生成树完成。

详解可以看 代码随想录 (programmercarl.com)

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定义边结构体,包含两个顶点和一个权重
struct Edge{
    int l, r, val;
};

// 定义顶点的最大数量
int n = 10001;

// 定义并查集数组,用于存储每个顶点的父节点
vector<int> father(n,-1);

// 初始化并查集,每个顶点的父节点设置为自己
void init(){
    for(int i = 0; i < n; i++)
        father[i] = i;
}

// 查找函数,用于找到顶点u的根节点,同时进行路径压缩
int find(int u){
    return u == father[u]? u:father[u] = find(father[u]);
}

// 合并函数,用于合并两个集合
void join(int u, int v){
    int m = find(u); // 找到顶点u的根节点
    int n = find(v); // 找到顶点v的根节点
    if(m == n) return; // 如果根节点相同,说明已经在同一个集合中
    father[n] = m; // 将顶点v的根节点设置为顶点u的根节点
}

int main(){
    int v, e; // v表示顶点数量,e表示边数量
    vector<Edge> edges; // 存储所有边的数组
    cin >> v >> e; // 输入顶点数量和边数量
    int v1, v2, val; // v1, v2表示边的两个顶点,val表示边的权重
    for(int i = 0 ; i < e; i++){ // 读取所有边的信息
        cin >> v1 >> v2 >> val; // 输入边的两个顶点和权重
        edges.push_back({v1, v2, val}); // 将边添加到数组中
    }

    // 按边的权重对边进行排序
    sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {
        return a.val < b.val;
    });

    init(); // 初始化并查集
    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;
} 

Kruskal算法的时间复杂度主要取决于边的排序和并查集操作。排序的时间复杂度是 O(E log E),其中 E 是边的数量。在边排序之后,算法会遍历每条边,并执行并查集操作,这个操作的时间复杂度接近 O(E log V),其中 V 是顶点的数量。因此,Kruskal算法的总时间复杂度是 O(E log E) 或 O(E log V),取决于哪个是主导项。

Kruskal算法的空间复杂度主要取决于并查集数据结构,它需要存储每个顶点的父节点信息,因此空间复杂度是 O(V)。

Kruskal算法适用于边比较稀疏的图,因为它的时间复杂度与边的数量成对数关系,而不是与顶点的平方成对数关系,如prim算法那样。

   

混沌系统在图像加密中的应用(随机性测试之FIPS 140-2测试和SP800-22测试) 本节内容我们将学习混沌序列的随机性测试,那么前面讲了,混沌系统产生的随机序列,它的随机性到底好不好,除了看相图、分岔图、指数图以外,还有一个非常重要的指标,那就是FIPS 140-2测试和SP800-22测试。(1)保证密码学模块的安全性:密码学模块在加密和解密敏感信息时使用随机数生成器来增加对手动解密和猜测攻击的抵抗力。通过进行FIPS 140-2测试,可以验证密码学模块是否符合安全标准,确保其实施和设计的安全性,以有效地保护敏感信息。 阅读详情

相关推荐

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5887

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 15

四路独立可控供电USB 2.0智能集线器设计

USB集线器是连接外设的基础接口设备,其供电管理能力直接影响系统可靠性与远程运维效率。传统HUB仅提供固定VBUS输出,缺乏端口级电源控制机制,难以实现软复位、故障隔离与功耗优化。本方案基于USB 2.0协议透明转发原理,通过硬件级电子负载开关(如MT9700)与独立MCU(ESP32-C3)协同,构建具备四路独立限流(680mA)、纳秒级通断响应、WiFi/MQTT远程管控能力的智能供电架构。技术价值体现在协议无侵入、控制域与数据域物理隔离、默认安全上电策略等工程实践要点,广泛适用于工业远程调试、实验室设

weixin_36289742的博客 193

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 437

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

5分钟搞定:用Ollama在MacBook上本地运行Qwen3大模型(附避坑指南)

本文详细介绍了如何在MacBook上使用Ollama快速部署和运行Qwen3大模型,包括安装步骤、性能优化技巧及常见问题解决方案。Ollama作为一款轻量级工具,特别适合M系列芯片的Mac用户,支持多种量化版本,显著降低资源消耗,提升推理速度。

sql99的博客 820

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 362

NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()

Please use torch.nn.Module.to_empty() instead of torch.nn.Module.to()输出(llama) (base) [root@localhost home]# nvidia-smi Unable to determine the device handle for GPU0000:09:00.0: Unknown Error。这是典型的“孤儿进程”,但它还是。(僵尸进程),占用 GPU 资源。如果进程仍然不消失,并且。,这意味着它的父进程是。

m0_61636632的博客 2096

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 77

大整数因数分解工具——yafu

可以将大整数放在一个新建文件中——data.txt,最后面一定要换行,不然会出现eof;done processing batchfile,运行命令。2.点击设置——系统——系统信息——高级系统设置——环境变量——点击PATH(上下都可以)——新建 添加yafu-x64.exe 所在路径——点击确定。,如果整数数过长,会出现错误mismatched parens;1.找到yafu-x64.exe 所在的文件路径。如果出现以下图像,说明配置成功。3.打开cmd,输入。

l2ohvef的博客 6156

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

摘要: 本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理,通过滑模观测器估算反电动势,结合PLL抑制抖振;2)系统架构,替代编码器信号;3)Simulink建模流程,涵盖Clarke变换、SMO离散化实现、PLL设计等关键步骤;4)参数整定指南和工程实践要点,如启动策略和故障处理。该方法具有成本低、可靠性高的优势,适用于家电、电动车等场景,仿真结果显示角度误差±5°,速度动态跟随良好。文章还提供了调试建议和常见问题解决方案。

MHD0815的博客 136

AI和大模型—从克里金算法说开去

克里金算法源于矿业勘探,通过空间自相关性实现稀疏数据下的最优预测,核心优势在于不确定性量化。在AI大模型中,其等价于高斯过程,广泛应用于超参数优化、小样本建模与推理调度。尽管面临计算复杂度高、核函数选择难等问题,通过稀疏化、分治法与低秩近似可有效优化。该方法在降低训练成本、提升泛化能力及减少幻觉方面表现突出,尤其适用于高维、高成本的智能系统优化,具有重要借鉴价值。

fpcc的专栏 602

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

1915

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 176

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 306

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 150

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 381

固件开发岗算法

背景:嵌入式固件岗,偏爱手写库函数、位运算、数组基础算法。

2502_90352018的博客 109

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 161

【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析

本工程基于Deep-OC-SORT核心模块,重构并适配了EmbeddingComputer(外观特征提取)、CMCComputer(相机运动补偿)与OCSort(主跟踪器)三类。前者实现整框/网格模式的特征提取与L2归一化;后者通过稀疏光流或SIFT匹配估计仿射变换,补偿相机运动;主跟踪器融合IoU、外观相似度与方向一致性,支持模块开关与自定义组件,实现高效多目标跟踪。

Jayson 博客 330

C++ 标准库算法全景指南

本文系统梳理C++标准库<algorithm>与<numeric>中100+算法,按功能分为非修改、修改、排序、二分查找、归并、堆、极值、字典序、排列及数值操作十大类,涵盖典型用法与时间复杂度。结合C++20范围(ranges)与投影特性,实现更简洁高效的代码。

sss123ddd的博客 227

高速公路无人机巡检系统:场景、算法与部署方案

高速公路巡检的工程矛盾,不在“能不能飞到”,而在“端侧算力、时延约束与精度要求三者之间如何分配”。路面病害要求毫米级识别,但高速动态成像与运动模糊压制了单帧精度;交通事件要求秒级推送,但隧道与峡谷的通信盲区切断了云端链路;桥梁梁底的无卫星信号环境,则把自主定位的难度推到了GNSS失效的边界。本文从“端—边—云”三级协同的工程逻辑出发,拆解路面病害、交通事件、桥梁结构三类场景下算法与部署的实际取舍,结合重庆绕城高速、广西六宾高速、南京6G低空巡检等公开数据,给出可复用的系统设计参考。

THJS优快云的博客 192

Consistent-Point半监督人群计数算法详解

本文首次指出并量化了点定位半监督人群计数中伪点的位置不一致与类别不一致问题(Mean-Teacher baseline 甚至不如只用标注数据),并给出两个极简正交模块——PA 用"被匹配的伪点与其邻近提议点定位相似"的洞察做空间平均,以 1/K 方差收缩稳住位置;IUC 用分类得分做实例级加权,压低决策边界附近模糊伪点的监督强度。两模块零推理开销、只引入一个超参 λ,在 5 数据集 × 3 标注比例的 15 个定位设置上全部 SOTA,并在 CPS 框架上验证泛化性,说明"伪标签一致性"是点定位半监督范式中

Keep_Trying_Go的博客 320

算法日常・每日刷题--<动态规划>41

给定两个字符串text1和text2,求其最长公共子序列长度。使用动态规划,定义dp[i][j]为text1前i个字符与text2前j个字符的最长公共子序列长度。若字符相等,则dp[i][j] = dp[i-1][j-1] + 1;否则取舍弃一方的最大值:dp[i][j] = max(dp[i-1][j], dp[i][j-1])。最终返回dp[m][n]。时间复杂度O(mn),空间复杂度O(mn)。

2503_92261635的博客 133

嵌入式 AI 智能相机怎么选?从算力、算法架构、部署方式深度对比

在工业自动化视觉检测场景中,嵌入式 AI 智能相机正在逐步替代传统 “工业相机 + 上位机工控机” 的方案。但市面上产品参数繁杂,很多工程师选型时容易被纸面算力、宣传卖点误导。本文从**持续算力性能、算法架构设计、现场部署模式**三个核心维度,梳理嵌入式视觉设备不同技术路线的差异、适用边界与落地痛点,为机器视觉工程师、自动化集成商、产线技改负责人提供可落地的选型参考。

VisionDataLab的博客 290

算法1. 双指针法-移动零

【代码】算法1. 双指针法-移动零。

2603_95728536的博客 228
上一篇: 代码随想录算法训练营Day62|冗余连接、冗余连接II
下一篇: 代码随想录算法训练营Day64|拓扑排序(卡码网117)、dijkstra朴素版
viaNoir
博客等级 码龄10年 535粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值