最小生成树之kruskal算法

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

kruskal算法的精髓在于:

每次选取一条边。

该边同时满足:1、在当前未选边中权值最小;2、与已选边不构成回路。

直到选取n-1条表是算法结束。找到MST活判断不存在MST。

 

代码设计:

1、利用优先级队列将权值小的边放到队列最前,优先出对,保证了每次选择的都是权值最小的边。

2、利用并查集的查找及结合把同处同一连通分量中的顶点连到同一父节点下。这样,每次判断是

否构成回路,只要判断父节点是否相同的即可。

 

代码:

#include<iostream>
#include<cmath>
#include<queue>
using namespace std;

const int maxn=101;  //图的最大节点数 

struct edge  //边 
{
    int from;  //起点 
    int to;    //终点 
    int cost;  //路径长 
    
    friend bool operator < (const edge &e1,const edge &e2)
    {
        return e1.cost>e2.cost;
    }
};

edge remMST[maxn];   //记录组成最小生成树的边  
int father[maxn];    //用来做并查集 
int nodeNum,edgeNum;  //顶点数、边数 
int MST;                //最小生成树 
priority_queue<edge> myQ;   //kruskal算法,存放边 

void storeMap()   //存储岛的桥构成的图 
{
    while(!myQ.empty()) myQ.pop();  //清空 
    
    int  from,to,cost;
    for(int i=0;i<edgeNum;i++)    //kruskal算法对于无向图也只需建一条边即可 
    {
        scanf("%d%d%d",&from,&to,&cost);

        edge e;
        e.from=from;
        e.to=to;
        e.cost=cost;
            
        myQ.push(e);
    }
}   
 
int find(int x)  //查找 
{
    if(x==father[x]) return father[x];
    return father[x]=find(father[x]);
}

bool judge()   //判断是否是一棵最小生成树 ,这里得注意起点和终点 
{
    int f=find(1);
    
    for(int i=2;i<=nodeNum;i++)
    {
        if(f!=find(i))
        {
            return false;
        }
    }
    
    return true;
}

void kruskal()   //kruskal算法 
{
    MST=0;
    
    for(int i=0;i<maxn;i++)
    {
        father[i]=i;
    }
    
    int num=0;   //记录MST的边数 
    while(!myQ.empty() && num!=nodeNum-1)
    {
        edge e=myQ.top();
        myQ.pop();
        
        int fx=find(e.from);
        int fy=find(e.to);
        
        if(fx!=fy)
        {
            father[fx]=fy;
            MST+=e.cost;
            
            remMST[num].from=e.from;
            remMST[num].to=e.to;
            remMST[num].cost=e.cost;
             
            num++;
        }
    }
}       

void output()   //打印最小生成树的值以及由哪些边组成 
{
    if(judge())
    {
        printf("from <-> to  cost:\n"); 
        for(int i=0;i<nodeNum-1;i++)
        {
            printf("%d %d %d\n",remMST[i].from,remMST[i].to,remMST[i].cost);
        } 
        printf("MST Is : %d\n",MST);
    } 
    else printf("No MST Exist!\n"); 
}
                  
int main()
{
    while(scanf("%d%d",&nodeNum,&edgeNum)!=EOF) 
    {
        storeMap();
         
        kruskal();
        
        output(); 
    }
    
    system("pause");
    return 0;
}        

 

测试实例:

1、图形

2、输入及结果

 

问题:

还是如何利用kruskal算法求解有向图的MST?

也留着吧。。。

 

 

 

 


 

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

DUdU_23456的博客 2万+

从零开始:PLUMED与GROMACS整合安装全攻略

本文详细介绍了如何从零开始整合安装PLUMED与GROMACS,包括系统环境检查、MPI配置、PLUMED编译安装、GROMACS补丁应用及常见问题解决方案。通过本教程,研究人员可以快速完成分子动力学模拟工具的整合安装,实现增强采样和自由能计算功能。

weixin_42520796的博客 292

最小生成树-Kruskal算法

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

qq_49786613的博客 2万+

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

m0_62030579的博客 3609

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 911

kruskal算法

kruskal算法求最小生成树

weixin_56265979的博客 2629

省三医院新门诊大楼网络安全建设项目实施方案

为了响应国家建设数字医疗,构建医联网、医共体的号召,新门诊大楼现有计算机网络,实现各门诊室、药房、医学影像科室及后勤科室的终端数据互通。在互联网出口以三层模式部署两台防火墙,作为连接公网的出口设备;出于等保合规和自身业务安全的考虑,现需要该网络上通过网络安全设备实现安全建设。公网出口防火墙,配置攻击防御策略,防御互联网上的病毒进入内网。公网出口防火墙配置攻击防御策略,防御外网对内网的入侵行为。服务器取得边界防火墙,配置攻击防御策略,入侵防御策略。公网出口防火墙配置入侵防御策略,防御外网对内网发起的D。

m0_63645854的博客 2016

最小生成树之克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法: 基本思想:按照权值从大到小的顺序选择 n - 1 条边,并保证这 n - 1 条边不构成回路 克鲁斯卡尔算法需重点解决两个问题: 1、对图的所有边按照权值的大小进行排序 解决:采用排序算法排序即可 2、将边添加到最小生成树中时,怎样判断是否形成了回路 解决:加入的边的两个顶点不能都指向同一个终点,否则会形成回路(终点定义:将所有顶点按照从小到大的顺序排列好之后,某个顶点的终点就是与它连通的最大顶点) 比如:在第三步后面不能加入<C, E>这条边,因为C、E此.

weixin_46497503的博客 2675

如何通过 GitHub Actions 使用 SSH 自动化部署到阿里云 ECS 实例

通过 GitHub Actions 和 SSH 自动化部署,可以显著提高你的开发效率和部署的可靠性。本文介绍了如何生成 SSH 密钥、将公钥添加到阿里云 ECS 实例、将私钥添加到 GitHub Secrets,以及编写 GitHub Actions 工作流来实现自动化部署。希望这篇文章对你有所帮助!

吃面不喝汤的博客 1512

古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法

   最近想在Gazebo中开发一些仿真内容,于是购买了古月学院的《如何在Gazebo中实现阿克曼转向车的仿真》课程,但是由于ROS 版本的更新,拿到手的课程资料不能直接在ROS Noetic版本中运行,经过我这几天的探索,对遇到的错误及解决方法进行了整理,方便后面购买课程的小伙伴更快的成功运行程序    在文章正式开始之前,先放一下我之前为了寻找该资料报错的原因,而写的两篇与该课程相关的文章链接,感兴趣的可以自行阅读    以阿克曼转向车为例对URDF和XACRO文件进行解读(点击可跳转)    将x

慕羽★的博客 5975

【数据结构】最小生成树之Kruskal算法

Kruskal算法可以形象地称为“加边法”,也就是说,该算法通过处理边,最终得到最小生成树。 存储结构 边集数组:由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息。 边数组的实现用到结构体!边数组每个数据元素由一条边的起点下(begin)、终点下标(end)和权(weight)组成。 struct Edge{ int begin, end, weight; }; 顶点数组使用普通一维数组 基本思想 图中每个顶点各自构成一个连通分量,然后按照边的权值由小到大的顺序.依次考察边集E中的各

zgsdlr的博客 3557

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 241

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

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

Eristic0618的博客 3404

【proteus】模拟串口和物理串口通讯

proteus提供了两种串口,一种是模拟的串口,还有一张是用软件仿真到硬件的物理串口。他们的区别就是:模拟串口只能在proteus内部进行通讯,但是物理可以通过软件映射到硬件上和单机或者串口软件通讯。 物理串口在元器件搜索COMPIM即可找到。 模拟串口在这里: PROTEUS仿真图: 物理串口COMPIM的设置: 模拟串口的设置: VSPD是一款虚拟串口软件,VSPD下载链接: 链接:https://pan.baidu.com/s/1AZygJCeWZfQTnxdCb_3TPg 提取码:12pm

阿蛋的博客 8934

OV9734 DATASHEET,完整规格书

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

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

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

mgsky1的博客 10万+

jre9下载 jdk9

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

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

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

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

m0_63223213的博客 7991

【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万+

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

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

m0_74496615的博客 2698

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

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

qq_54162207的博客 8323

最小生成树(Kruskal算法)

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

小女不才 3万+

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

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

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

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

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

weixin_58663649的博客 2263

kruskal算法_最小生成树算法——kruskal

如图,输出最小生成树的生成过程算法思想:每个边的权值进行从小到大排序然后从小到大添加到最小生成树中,若添加一个边后构成环路,则此边不能添加。直到每个顶点都加入到最小生成树中。需要一个结构体来存储 每个边的权值与始末顶点。再进行排序。struct { VexType head; VexType tail; ArcType lowcost; }Edge[MAXSIZE]; //存入每条边的首尾以...

weixin_39958138的博客 186

kruskal算法求最小生成树

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

clzZ2的博客 5314
上一篇: 最小生成树之prime算法实现
下一篇: 有向图强连通分量之tarjan算法
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值