Kruskal算法

Kruskal算法求解最小生成树 阅读详情

Kruskal算法

用途

处理最小生成树(MST)问题,即在给定的图中求树,使得这棵树拥有图中所有顶点,且所有边都是图中已知的边,且满足整棵树的边权之和最小。适用于边少的稀疏图。

算法描述

总体思路为:每次找到当前图中未被选中的边权最小的边,如果边的两个顶点不在同一个连通块中,那么就把该边加入到最小生成树集合中。具体步骤如下:

  1. 创建并维护一个并查集,用于判断结点所属连通块;
  2. 对图中所有边按边权从小到大排序;
  3. 依次选择每条边,判断边的顶点是否属于同一连通块,如果否则将该边加入到最小生成树中,如果是则不作处理;
  4. 重复步骤3直到处理完所有边,或是最小生成树中的边数已经达到 n - 1;
  5. 判断最小生成树中的边数,如果小于 n - 1,说明图不连通,无解。

代码实现

const int maxn = 1000;

struct edge
{
    int u, v;       // 边顶点
    int cost;       // 边权
};

edge E[maxn];       // 边数组
int n, m;           // 结点数,边数
int father[maxn];   // 并查集数组

bool cmp(edge a, edge b)        
{
    return a.cost < b.cost;     // 按照边权从小到大排序
}

int findRoot(int x)             // 寻找根节点并压缩路径
{
    if (x == father[x])
        return x;
    
    int root = findRoot(father[x]);
    father[x] == root;
    return root;
}

int Kruskal()
{
    int sum = 0, numEdge = 0;       // 记录边权和,最小生成树边数
    
    for (int i = 0; i < n; i++)     // 初始化并查集数组
        father[i] = i;
    sort(E, E + m, cmp);            // 边排序
    
    for (int i = 0; i < m; i++)
    {
        int rootU = findRoot(E[i].u);
        int rootV = findRoot(E[i].v);
        if (rootU != rootV)         // 顶点属于不同连通块,则将边加入树
        {
            father[rootU] = rootV;
            sum += E[i].cost;
            numEdge++;
            if (numEdge == n - 1)   // 边数达到 n - 1 退出
                break;
        }
    }
    
    if (numEdge < n - 1)           // 边数小于 n - 1,说明图不连通,无解
        return - 1;
        
    return sum;                     // 返回边权和
}
Kruskal算法和Prim算法 Kruskal算法和Prim算法 在无向图中,连通且不含圈的图称为树。给定一个无向图G=(V,E),连通G中所有点,且边集使E的子集的树称为G的生成树,其中权值最小的生成树称为最小生成树(MST)。构造MST的算法有很多,最常见的即是Kruskal算法和Prim算法。 Kruskal算法 ... 阅读详情

相关推荐

小龙虾 OpenClaw 安装全攻略:本地部署 AI 智能体一步到位

OpenClaw(昵称小龙虾)是一款 MIT 开源协议的本地优先 AI 智能体执行网关,支持多平台接入、本地部署,能实现自然语言驱动的设备自动化操作,区别于纯对话 AI,可直接操控系统执行实际任务,数据全程本地存储更安全。本文带来 2026 最新版 OpenClaw 安装教程,适配 Windows/macOS/Linux 全系统,新手也能一键搞定。

lujiawei00的专栏 1975

kruskal算法求最小生成树

描述 要求对一个图使用kruskal算法求最小生成树,依次输出选出的边所关联的顶点序列,要求下标较小者在前,如图所示,其顶点序列为1 3 4 6 2 5 3 6 2 3 输入 若干行整数 第一行为两个整数,分别为图的顶点数和边数 第二行开始是该图的邻接矩阵,主对角线统一用0表示,无直接路径的两点用100来表示(保证各边权值小于100) 输出 若干用空格隔开的整数 样例输入 6 10 0 6 1 ...

clzZ2的博客 5313

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 472

Networking POJ - 1287 (最小生成树 裸题)

Networking POJ - 1287 存在许多点和点与点之间的路径,路径长度不一,点到点之间可能存在多条路径。挑选部分路径使得所有点连通且总路径长度最小。 Input 多样例输入。每个样例都保证有解。 每个样例的第一行有两个整数,P(点的个数),R(点与点之间的路径总数)。 接下来的R行输入路径,每行含3个整数,前两个数表示连接的两个点,第三个数表示路径长度。 当P为0时输入结束。样例与样...

Suprit's blog 765

中微8S6990外设开发实战:从GPIO配置到低功耗休眠的完整指南

本文提供了中微8S6990增强型8051单片机从GPIO配置到低功耗休眠的完整实战指南。详细讲解了开发环境搭建、GPIO灵活配置、定时器中断、ADC采样优化、PWM电机控制等核心外设的编程要点与避坑技巧,并重点阐述了实现超低功耗休眠的系统性外设管理策略,帮助开发者快速上手并优化产品续航。

weixin_29162439的博客 533

SAM3模型国内快速上手:Modelscope权重下载+环境配置一条龙指南

本文详细介绍了SAM3模型在国内的快速部署方案,包括通过Modelscope平台下载权重文件、优化CUDA 11.8环境配置以及实战避坑技巧。针对国内开发者常见的网络问题和环境兼容性问题,提供了从权重下载到模型加载的全流程指南,帮助用户高效完成部署并快速上手SAM3模型。

weixin_28465009的博客 1149

Kruskal算法求最小生成树

啧啧啧,一种mlogm 的算法求最小生成树 代码极其简单,首先把这些边按照w进行排序,然后从小枚举权值,如果a和b不在一个集合中,则把a,b加入到集合中,然后将res+ =w; #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using ...

遇见生活 164

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 320

Kruskal(Kruskal算法求最小生成树)

题目: 代码: #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010, M = 200010, INF = 0x3f3f3f3f; int n, m; int p[N]; struct Edge { int a, b, w; bool operator< (const Edge &a

m0_62593364的博客 212

Open3D 点云转深度图像【2026最新版】

python版本Open3D 实现的点云转深度图像,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 2838

TGAT Python:图神经网络中的动态图算法

其中,图神经网络中的动态图算法成为了研究的热点之一。在模型的 forward 方法中,通过循环调用 TGATLayer 实例来进行图神经网络的前向传播。最终,模型返回图中节点的表示向量 output,可以用于图分类等任务。TGAT 算法的核心思想是在节点之间建立注意力连接,以捕捉节点在不同时间步之间的关系。TGAT 算法通过引入注意力机制和时间信息,从而有效地对动态图数据进行建模和分析。通过以上 Python 代码,我们可以方便地构建和训练 TGAT 模型,并在图分类任务中应用它。

2301_79366435的博客 1827

kruskal算法

kruskal算法(读者可以将其读作“克鲁斯卡尔算法”)同样是解决最小生成树问题的一个算法。和prim算法不同,kruskal算法采用了边贪心的策略,其思想极其简洁,理解难度比prim算法要低很多。 kruskal算法的基本思想为: 在初始状态时隐去图中的所有边,这样图中每个顶点都自成一个连通块。之后执行下面的步骤: ①对所有边按边权从小到大进行排序。 ②按边权从小到大测试所有边,如果当前...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 4625

【软考高级架构】论文范文16——论分布式缓存架构设计及其应用

随着互联网业务的快速发展,高并发访问和海量数据处理对系统响应时间提出了极高要求,传统基于磁盘的数据库存储已难以满足毫秒级的性能需求。分布式缓存作为一种高性能、可扩展的数据存储中间件,能够有效减轻后端数据库压力、加速热点数据访问、提升系统吞吐量,已成为高并发系统架构中的核心组件。本文以笔者主导的某大型电商平台秒杀系统建设项目为案例,围绕分布式缓存架构设计展开论述。笔者担任系统架构师,主导了缓存选型、数据分片策略、缓存一致性方案、高可用架构及缓存穿透/雪崩/击穿防护机制的设计与落地。

qq837993702的博客 163

Prim算法、Kruskal算法

文章目录Prim算法Kruskal算法 主要内容: Prim算法 最小生成树对应的问题一般都是无向图,最小生成树所构成的图总边权之和最小,但不能是环,否则不能称之为"最小"。 Prim算法是求解最小生成树的算法之一,适用于稠密图,Prim算法和Dijkstra算法步骤很相似,不同的是Dijkstra需要更新所有邻居到起点的距离,也就是"松弛操作",但Prim不需要,只需要把距离集合最近的点加...

ker的博客 5428

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

KRUSKAL算法

图的KRUSKAL算法是用以求解最小生成树的一种有效算法,每次从待选的边中选出最短的那一条边,加入到已有的树中,读者可以与PRIM算法相比较他们之间的异同,下面是代码,该代码利用堆排序以求能在较短时间内取出最短的那一条边。 package oj; class Edge{ int x1; int x2; int len; public Edge(int x1, int x2, int

杨煜冬煜杨的博客 429

OV9734 DATASHEET,完整规格书

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

Kruskal 算法 详解

Kruskal 算法 详解

T_Y_F_的博客 1393

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

图论算法——Prim算法和Kruskal算法

引言 我们要学习的第一种计算最小生成树的算法,它每一步都会为一颗生长中的树添加一条边。 下面分析下算法思路 思路 一开始这棵树只有一个顶点,然后会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。 每次当我们向(生成)树中添加了一条边之后,也向树中添加了一个顶点。要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入优先队列。要注...

日积月累,天道酬勤 1732

Prim算法和Kruskal算法

Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。       一、Prim算法:     Prim算法实现的是找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。     Prim算法是这样来做的:      首先以一个结点作为最小生成

黄玮鹏的专栏 3万+

关于图的算法——kruskal算法,prime算法,和Dijkstra算法

关于图的算法——kruskal算法,prime算法,和Dijkstra算法

whitefish_cat的博客 1785

Kruskal算法+最小生成树算法总结

Kruskal算法是一种基于贪心策略的最小生成树算法,其核心思想是通过并查集和快速排序实现。算法首先将所有边按权重排序,然后依次选择不构成环的最小权重边加入生成树。实现中采用路径压缩和按秩合并优化的并查集来判断连通性,时间复杂度为O(ElogE),空间复杂度为O(E+V)。相比Prim算法,Kruskal更适合处理稀疏图,代码实现更简洁直观。

2401_82472941的博客 1124

Kruskal 算法深入

终于开启了图的算法的旅程~有请第一个算法——KruskalKruskalKruskal算法,生活中,如果我们要在几个城市之间建立通路,最根本的目标是:用料最少,路径最短。这种情况该如何做呢?不知道你有没有想到图的概述中的极小连通子图的概念。如图最左边图旁边的都是其的极小连通子图(还能画出好几种),以这种方式变现出来的路径都很短。但当给不同的边加上权值(路的成本),那究竟哪个是最好的选择呢?这就有了最小生成树的概念。最小生成树可是和树结构没有一点关系的哦~在含有n。

2401_88036229的博客 732

Kruskal算法详解

Kruskal算法是一种基于贪心策略和并查集的数据结构来解决最小生成树问题的有效算法。它通过不断选择权值最小的边并检查是否形成环来构建最小生成树。算法的时间复杂度和空间复杂度都较为优秀,因此在实际应用中得到了广泛的应用。通过本文的详解和C++代码实现,读者可以更加深入地理解Kruskal算法的原理和实现过程。

Weirdo的博客 2453

Kruskal 算法

- Kruskal 算法 - Kruskal 算法: Kruskal 算法总是维护无向图的最小生成森林。最初,可认为生成森林由零条边构成,每个节点各自构成一棵仅包含一个点的树。在任意时刻,Kruskal 算法从剩余的边中选出一条权值最小的,并且这条边的两个端点属于生成森林中两棵不同的树(不连通),把该边加入生成森林。图中节点的连通情况可以用并查集维护。 复杂度: 时间复杂度:O(nlogn) ...

Pandora_heart的博客 427
上一篇: Prim算法
下一篇: 拓扑排序
绿色小光头
博客等级 码龄10年 10粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值