最小生成树Kruskal算法

Prim算法 与 Kruskal算法 求最小生成树 一、Prim算法 普利姆(Prim)算法适用于求解无向图中的最小生成树(Minimum Cost Spanning Tree)。下面是Prim算法构造最小生成树的过程图解。                            &nbsp... 阅读详情

HDU 1301

题意:题干给出原先的图,其中有n个点,给出n-1个点的关系,问连接所有点之后最小路径和

并查集+结构体排序

Kruskal算法

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long int
struct zuobiao
{
    int u,v,len;
}a[121212];
int f[100];
int cmp(zuobiao a,zuobiao b)
{
    return a.len<b.len;
}
int find(int a)
{
    int r=a;
    while(f[r]!=r)
    r=f[r];
    int i=a;
    int j;
    while(i!=r)
    {
        j=f[i];
        f[i]=r;
        i=j;
    }
    return r;
}
void merge(int a,int b)
{
    int A,B;
    A=find(a);
    B=find(b);
    if(A!=B)
    f[B]=A;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=0;i<n;i++)
        {
            f[i]=i;
        }
        int cont=0;
        for(int i=0;i<n-1;i++)
        {
            char uu[3];
            char vv[3];
            scanf("%s",uu);
            int k;
            scanf("%d",&k);
            for(int j=0;j<k;j++)
            {
                int dis;
                scanf("%s%d",vv,&dis);
                a[cont].u=uu[0]-'A';
                a[cont].v=vv[0]-'A';
                a[cont].len=dis;
                cont++;
            }
        }
        ll output=0;
        sort(a,a+cont,cmp);
        for(int i=0;i<cont;i++)
        {
            if(find(a[i].u)!=find(a[i].v))
            {
                output+=a[i].len;
                merge(a[i].u,a[i].v);
            }
        }
        printf("%I64d\n",output);
    }
}

转自:https://blog.youkuaiyun.com/mapoos/article/details/79551885

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;                     // 返回边权和
}
图的最小生成树之Prim算法及Kruskal算法 最小生成树 定义:无向图连通图G中,由所有顶点构成且总价值(连接权值和)最低的一棵树(拓扑结构)称为一个最小生成树。 最小生成树顶点为|V|个,边数为|V|-1,没有圈。 对任一生成树T,如果将图中一条不属于T的边添加至T,则会产生一个圈,从该圈中除去任意一条边,则会又恢复成生成树。 下图为一示例: 对于上面的无向有权连通图,其最小生成树为: 解决最小生成树问题有两种算法Prim算法和... 阅读详情

相关推荐

MATLAB实现Kruskal算法求解最小生成树

图论是数学的一个分支,专注于研究图的性质,它由点(顶点)和线(边)组成,用于建模连接关系。图论在计算机科学、运筹学、工程学以及社会科学等领域有着广泛的应用。图论中的概念,如路径、回路、连通性以及最小生成树等,在解决实际问题,如网络设计、电路布线和社交网络分析中扮演着重要角色。Kruskal算法是一种用来寻找最小生成树(MST, Minimum Spanning Tree)的贪心算法,由数学家Joseph Kruskal于1956年提出。

weixin_35755640的博客 844

kruskal算法求最小生成树

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

clzZ2的博客 5313

全网最全的AItium Designer 16下载资源与安装步骤

Altium Designer 除了全面继承包括Protel 99SE、Protel DXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。...

WQ的博客 1万+

Kruskal算法

Kruskal算法 用途 处理最小生成树(MST)问题,即在给定的图中求树,使得这棵树拥有图中所有顶点,且所有边都是图中已知的边,且满足整棵树的边权之和最小。适用于边少的稀疏图。 算法描述 总体思路为:每次找到当前图中未被选中的边权最小的边,如果边的两个顶点不在同一个连通块中,那么就把该边加入到最小生成树集合中。具体步骤如下: 创建并维护一个并查集,用于判断结点所属连通块; 对图中所有...

Mapoos 333

告别轮询!手把手教你用S32K3的FlexCAN Enhanced FIFO+DMA实现高效CAN FD数据接收

本文详细介绍了如何利用S32K3芯片的FlexCAN Enhanced FIFO与DMA组合方案,实现高效CAN FD数据接收,彻底告别传统轮询和中断模式。通过深度缓冲、智能过滤和DMA联动技术,该方案在5Mbps高负载场景下将CPU占用率从42%降至3%以下,显著提升系统实时性和吞吐量。

weixin_30906185的博客 502

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4649

Kruskal算法求最小生成树

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

遇见生活 164

OPC与AI智能体集成实战:一人公司的技术栈构建与避坑指南

1. 先搞清楚“一人公司”和“AI工具”到底在解决什么问题 最近看到不少关于“裸辞搞OPC一人公司”和“AI时代骗局”的讨论,结合搜索热词里高频出现的 openclaw 、 AI编程 、 OPC ,我觉得有必要把这里面的水搅一搅,说点实在的。 首先得拆开看。标题里混了三个东西: 一人公司 、 OPC/OpenClaw 、 AI培训 。它们被放在一起讨论“骗局”,但本质上解决的是不同层面的问题。 一人公司 ,或者说个人工作室、独立开发者模式,核心是 用最小化团队(甚至一个人)去承接项目、开发产品或提供服务 。

weixin_29038345的博客 320

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

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

Suprit's blog 765

Carla-编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?

编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?不妨看看这个!

DSK_981029的博客 2573

RK3568笔记二:部署手写数字识别模型

部署手写数字识别模型,使用手写数字识别(mnist)数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的深度学习入门的必学模型,是深度学习领域中的经典卷积神经网络(CNN)架构之一。过程分为:训练,导出ONNX,转化RKNN,测试。

1170

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

3、Tone Mapping色调映射(Advanced High Dynamic Range Imaging )

3、Tone Mapping色调映射(Advanced High Dynamic Range Imaging) 如今,大多数可用的显示设备无法本地显示HDR内容。 入门级显示器的对比度仅为200:1。 尽管高端液晶电视具有更高的对比度,但平均对比度约为10,000:1,但通常每个色彩通道的离散度为8位,很少为10位。 这意味着色调限制为255。在过去的二十年中,研究人员花费了大量时间和精力来压缩HDR图像和视频的范围,以便可以在LDR显示器上更“自然”地看到数据。 图3.1 色调映射和真实场景之间.

ISP行业的忠实粉丝 1866

【算法】Kruskal最小生成树算法

算法学习笔记之Kruskal最小生成树算法

Eristic0618的博客 3404

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 837

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最小生成树-Kruskal算法

数据结构:最小生成树-Kruskal算法 Kruskal算法采用的是边贪心思想,我们先大概讲一下它的大概思想,首先我们先假设先隐藏所有的边,这样每个点会成为一个连通块。 步骤1:先对图中所有的边按照权值进行排序 步骤2:如果当前这条边的两个顶点不在一个连通块里面,那么咋就用并查集的Union函数把他们合并在一个连通块里面(也就是把他们放在最小生成树里面),如果再在一个并查集里面,我们就舍弃这条边,不需要这条边。 步骤3:一直执行步骤2,知道当边数等于定点数的数目减去1,那就说明这n个顶点就连合并在一个集合

qq_49786613的博客 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【算法】图的最小生成树(Kruskal算法)

这篇文章是2.0版本,修正了前一版中的错误,感谢广大网友指正! 前面介绍了图的最小生成树的Prim算法,这个算法是从顶点的角度来刻画生成树的。今天要说的Kruskal(克鲁斯卡尔)算法,是从边的角度来进行刻画的。 Kruskal算法用到的数据结构有: 1、边顶点与权值存储结构(即图是由连接某一条边的两个顶点,以及这条边的权值来进行存储,具体看后面的例子) 2、并查集(具体是什...

mgsky1的博客 10万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最小生成树的Kruskal算法-详解

最小生成树的Kruskal算法 一、 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 1.2 例子: 通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离 1.3 理解 最小生成树: 将最小生成树拆分成: 最小 生成 树 树: • 树中没有环 • 所有的顶点都要在树中 • 对于N条

DUdU_23456的博客 2万+

《最小生成树算法详解:Kruskal的优雅实现》

K算法, Kruskal算法是一个经典的贪心算法,用于解决最小生成树问题。它由美国数学家Joseph B. Kruskal在1956年提出,因此该算法得名Kruskal。

博客网站地址: https://arsenova.xyz 我会将优快云上的博客重修一部分迁移到网站上。 文章会做同步更新,但我不会在这个糟糕的平台多待1秒。下面是我要说的话,save your time. keep going 1694

最小生成树(Prim算法,Kruskal算法)

用Prim算法和Kruskal两种算法实现构建并输出最小生成树

m0_63223213的博客 7991

图解最小生成树问题:Kruskal算法和Prim算法

本文全面介绍了两类经典算法,用于解决无向图中的最小生成树(MST)问题。文章解释了最小生成树的概念,并详细对比分析了Kruskal和Prim两种算法的原理、特点及应用场景。文章重点以图文并茂的方式,通过示例演示了算法的执行过程,包括详细的步骤解析和权值图示。Kruskal算法侧重边的逐步加入,适用于稀疏图;Prim算法侧重点的逐步扩张,适用于稠密图。两者均采用贪心策略,在网络设计、电路布线等领域有着广泛的应用。

m0_74496615的博客 2696

【MATLAB】最小生成树Kruskal算法

目录1.Kruskal算法1.1 基本思想1.2 步骤2.算法实现2.1 存储结构2.2 MATLAB代码 1.Kruskal算法 1.1 基本思想 将图的n个顶点看作n个分离的部分树,每个树具有一个顶点,算法的每一步就是选择连接两个分离树的具有最小权值的边,将两个树合二为一,直到只有一个树为止(进行n-1步)得到最小生成树。 1.2 步骤 ∙\bullet∙ 选择边e1,使得w(e1)尽可能小。 ∙\bullet∙ 再次选择最小边,必须满足不构成圈且边权尽可能小。 ∙\bullet∙ 直到不能满足则停止

taoxing 1万+

数据结构C++——最小生成树之Prim算法和Kruskal算法

数据结构C++——最小生成树之Prim算法和Kruskal算法 文章目录数据结构C++——最小生成树之Prim算法和Kruskal算法一、最小生成树的基本概念二、最小生成树之Prim算法①Prim算法的实现原理②Prim算法中的Min函数的实现③Prim算法的代码实现④测试的完整代码三、最小生成树之Kruskal算法①Kruskal算法的实现原理②Krusal算法的代码实现③测试的完整代码四、总结 一、最小生成树的基本概念 最小生成树: 在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树称为该连通网

qq_54162207的博客 8320

【算法笔记】Kruskal/Prim算法——求解最小生成树问题

最小生成树问题:给定一张带权无向图G,求它的一棵生成树,使其中所有边权之和最小。本文将介绍针对这种问题的两种经典算法——Kruskal和Prim。

天生我材必有用,千金散尽还复来。 4946

最小生成树(Kruskal算法)

  最小生成树(Kruskal和Prim算法) 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。 生成树:一个连通图...

小女不才 3万+

基于Kruskal和Prime算法的最小生成树算法

Kruskal算法是一种贪心算法,用于求解最小生成树问题。

weixin_58663649的博客 2263
上一篇: Dijkstra最短路算法和Floyd最短路算法
下一篇: NENU 17级算法学习小组 Round 2 0530
flyzer
博客等级 码龄9年 27粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值