用克鲁斯尔算法求最小生成树

克鲁斯卡尔(Kruskal )算法——求最小生成树贪心算法 克鲁斯卡尔算法是一种用于求解最小生成树问题的贪心算法。最小生成树是一个连通图的生成树,其边的权重之和最小。一、原理 克鲁斯卡尔算法的核心思想是按照边的权重从小到大逐渐选择连通图的边,直到所有顶点都被连接为止。在每一步中,选择当前权重最小的边,若该边的两个顶点尚未连接,则将其添加到最小生成树的边集合中,并将这两个顶点归为同一... 阅读详情
/*用克鲁斯尔算法求最小生成树*/
#include <iostream>
using namespace std;
/*邻接矩阵的类型定义*/
#define MAX 10000000
#define MAX_VERTEX_NUM 20
typedef struct
{
	char vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息
	int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息
	int vexnum,edgenum;//顶点树和边数
}MGraph;
/*构造无向联通网的邻接矩阵*/
void CreateUDN_AM(MGraph &G,int n,int e)
{
	G.vexnum=n;
	G.edgenum=e;
	
	int i,j,k;
	for(i=0;i<n;i++)
		cin>>G.vexs[i];//输入顶点信息
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			G.edges[i][j]=MAX;//将矩阵初始化为无穷大
	for(k=0;k<e;k++)
	{
		cin>>i>>j;
		cin>>G.edges[i][j];//这里只用输入对称的边就行,也就是输入下矩阵或是上矩阵
		G.edges[j][i]=G.edges[i][j];
	}
}
//边表结点类型的定义
typedef struct
{
	int begin,end;//边的起点和终点
	int cost;//边上的权值
}EDGE;
EDGE edge[MAX_VERTEX_NUM];
//冒泡排序
void bubble_sort(EDGE edge[],int n)
{
	int i,j;
	int t;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(edge[i].cost>edge[j].cost)
			{
				t=edge[i].cost;
				edge[i].cost=edge[j].cost;
				edge[j].cost=t;
				t=edge[i].begin;
				edge[i].begin=edge[j].begin;
				edge[j].begin=t;
				t=edge[i].end;
				edge[i].end=edge[j].end;
				edge[j].end=t;//将位置及权值都进行交换
			}
}
//找f这个元素所在的连通分量中的标记元素的位置
int find(int forest[],int f)
{
	while(forest[f]>0)
		f=forest[f];
	return f;
}
//求最小生成树
void MiniSpanTree_Kruskal(MGraph &G)
{
	int i,j,k=0;
	int LocationOfBegin,LocationOfEnd;
	int forest[MAX_VERTEX_NUM];
	for(i=0;i<G.vexnum;i++)
		for(j=i+1;j<G.vexnum;j++)
			if(G.edges[i][j]<MAX)
			{
				edge[k].begin=i;
				edge[k].end=j;
				edge[k].cost=G.edges[i][j];
				k++;
			}//将边及边的信息赋值到edge数组中
	bubble_sort(edge,G.edgenum);//对edge里的元素按权值进行由小到大进行排序
	for(i=0;i<G.edgenum;i++)
		forest[i]=0;//初始化每个顶点,将每个顶点看做一个连通分量,并且置标识为0
	for(i=0;i<G.edgenum;i++)
	{
		LocationOfBegin=find(forest,edge[i].begin);
		LocationOfEnd=find(forest,edge[i].end);//找该顶点所在连通分量的标记元素的位置
		if(LocationOfBegin!=LocationOfEnd)
		{//如果起点和终点所在的连通分量的标记元素的地址相同,说明起点和终点在同一个连通分量中
			forest[LocationOfBegin]=LocationOfEnd;//该句的作用是将两个连通分量连成一个连通分量
			cout<<edge[i].begin<<"-"<<edge[i].end<<":"<<edge[i].cost<<endl;
		}
	}

}
void main()
{
	freopen("a.txt","r",stdin);
	MGraph G;
	CreateUDN_AM(G,6,9);
	MiniSpanTree_Kruskal(G);
}

 

克鲁斯卡尔算法(Kruskal算法)求最小生成树 克鲁斯卡尔算法(Kruskal算法)求最小生成树 克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(eloge)。和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树。 对于任意一个连通网的最小生成树来说,在要求总的权值最小的情况下,最直接的想法就是将连通网中的所有边按照权值大小进行升序排序,从小到大依次选择。 由于最小生成树本身是一棵生成树,所以需要时刻满足以下两点: 1.生成树中任... 阅读详情

相关推荐

克鲁斯卡尔算法求最小生成树(并查集)

在说克鲁斯卡尔算法之前我们得明白一个并查集的知识,这是使用克鲁斯卡尔算法求最小生成树的前提。 并查集主要用来解决判断两个元素是否属于同一个集合,以及把两个集合合并的一种数据结构。 并查集初始时把每一个对象看作是一个单元素集合;然后依次按顺序读入等价对后,将等价对中的两个元素所在的集合合并。在此过程中将重复地使用一个搜索(find)运算,确定一个元素在哪一个集合中。当读入一个等价对A≡B时,先检

blackMamba 6336

最小生成树算法——kruskal

Kruskal 什么K算法,K算法就是最小生成树算法。具体说来,就是对于一张已经存在的图,如下图, **在不破坏连通性的情况下,只留下整体权重最小的边的集合。就是边的权值加起来最小。**拿上面图举例,把权值100和50的边去掉就达到了我们的要求(所有可能性中,边的权值加起来最小的情况): 算法流程 先把所有的边根据权值由小到大排序。假设图中每个结点都是一个单独的集合,从权值小的边开始选,如果有多条权值一样的边,无论先选哪条都行,选中某条边后,看这条边两边的点有没有在同一个集合里面,没有在一个集合里,就选

Harrison的学习博客 1554

C/C++ 克鲁斯卡尔Kruskal算法求最小生成树算法详解及源码

最小生成树是一个连通无向图中生成树权值之和最小的生成树。克鲁斯卡尔算法通过将图中的边按照权值从小到大排序,然后遍历所有边,将权值最小且不形成环路的边添加到最小生成树中,直到最小生成树中包含了所有的顶点。克鲁斯卡尔算法通过将图中的边按照权值从小到大排序,然后遍历所有边,将权值最小且不形成环路的边添加到最小生成树中,直到最小生成树中包含了所有的顶点。克鲁斯卡尔算法通过将图中的边按照权值从小到大排序,然后遍历所有边,将权值最小且不形成环路的边添加到最小生成树中,直到最小生成树中包含了所有的顶点。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 951

常用算法——克鲁斯卡尔(Kruskal)算法(公交站问题,最小生成树问题 )

克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 基本思想:按照权值从小到大的顺序选择n-1 条边,并保证这n-1 条边不构成回路 具体做法:首先构造一个只含n 个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森 林中不产生回路,直至森林变成一棵树为止 克鲁斯卡尔算法图解说明 以城市公交站问题来图解说明克鲁斯卡尔算法的原理和步骤: 代码实现 import java.util.Arrays; public class KruskalCase

笔记别偷看 4356

GX Works2系统启动失败排查指南:从环境配置到修复方案

在工业自动化与PLC编程调试中,软件启动异常是常见的工程痛点。当开发工具因系统环境配置不当而频繁报错时,往往不是简单的重启能解决的。运行库缺失、区域设置错误、临时目录失效或系统服务被禁用,都可能导致编程软件无法完成初始化流程。掌握从基础环境检查到系统组件修复的系统性排查思路,是提升工控开发效率的关键能力。本文从软件初始化原理出发,结合Windows系统维护实践,梳理一套适用于工业软件启动故障的通用诊断方法,并自然聚焦到三菱GX Works2常见启动失败问题的实际处理,帮助工程师快速定位并解决环境性故障,保障

weixin_42567046的博客 459

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

我所知道的十大常用算法之克鲁斯尔算法(最小生成树)

前言需求今天我们学习的是克鲁斯尔算法,我们还是从一个场景里引入看看有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通1.各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?一、什么是克鲁斯尔算法?克鲁斯卡尔(Kruskal)算法:用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的...

我吃西红柿 714

嵌入式STM32控制电梯面板

嵌入式STM32控制电梯面板 用点阵来显示电梯向上还是向下运动,用数码管来显示楼层数(由于灯阵显示楼层数比较困难故用数码管代替)。当按下对应的按钮,就可以去到对应层数,可上升可下降。 #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_it.h" #define uint unsigned int #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) #define

code_init_的博客 2111

最小生成树算法-- K算法、P算法

最小生成树 最小生成树 (Minimum Spanning Tree) ,假设一个图中有N个节点,用N-1条边将所有N个节点连通起来,要求这N-1条边的权值之和最小。常用的算法有:Kruskal(克鲁斯卡尔)算法和Prim(普里姆)算法。 Kruskal 算法 Kruskal 算法利用小根堆和并查集来实现,步骤: 总是从权值最小的边开始考虑,依次考察权值依次变大的边 当前的边要么进入最小生成树的集合,要么丢弃 如果当前的边进入最小生成树的集合中,不会形成环,就要当前边,否则不要 考察完所有边之后,最小生成

Pain is inevitable but suffering is optional. 1666

【电击防护篇】电击防护技术详解:从人体效应到接地系统全解析

本文系统讲解了电击防护的关键知识,包括电流对人体的影响(如30mA是心室颤动阈值)、人体电阻特性(700Ω-6100Ω)以及电气接触防护措施。重点分析了TT、TN和IT三大接地系统的结构特点与应用场景,强调TN-S系统最安全,IT系统供电连续性最佳。详细介绍了漏电保护器(RCD)的工作原理与选型指南,建议人身防护选用30mA高灵敏度RCD。文章通过对比表总结三大系统的安全性、成本及适用场景,为电气安全设计提供实用参考。

2301_81299416的博客 1742

实战分享:如何用Jetson Nano+HM30图传搭建低空YOLOv5检测系统(附VNC避坑指南)

本文详细介绍了如何利用Jetson Nano和HM30图传搭建低空YOLOv5检测系统,重点解决了无人机应用中的硬件连接和VNC延迟优化问题。通过对比WiFi直连与图传方案的优劣,提供了网络配置、VNC优化及YOLOv5模型加速的实战技巧,帮助开发者实现高效稳定的低空目标检测系统。

weixin_29174385的博客 110

【算法】克鲁斯卡尔算法求最小生成树

1.克鲁斯卡尔算法是用来求加权连通图的最小生成树的算法2.基本思路:为了连通 n 个顶点,按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路3.具体做法:首先构造一个只含 n 个顶点的森林,然后按照权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。

2302_78914800的博客 2637

【WRF-Chem教程-附录B】使用 MOZART 与WRF-Chem

使用MOZART与WRF-Chem

WW、forever的博客 242

克鲁斯卡尔算法求最小生成树

1.克鲁斯卡尔算法     克鲁斯卡尔算法的核心思想是从边集出发,逐步把代价最小且不与已经加到最小生成树的边集构成回路的边加入到最小生成树的边集中,直到求出构成最小生成树的n-1边(n是图的顶点数)。算法的基本步骤如下。 对边集进行排序。 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中。(简单的说就是试探性的加入这条边看加入后是否构成环)。 重复2,直至图G中所有的节点都在同一个连通分量中。   

‎‎‎‎‎不想吃泡面 6663

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 551

米哈游运维面试题及参考答案

Linux 系统运行级别是用于定义系统启动时所需要达到的功能状态。运行级别 0:表示系统停机状态,用于关闭系统,是系统的关机级别。当系统切换到这个级别时,会停止所有的服务和进程,然后关闭系统。运行级别 1:也称为单用户模式。在这个级别下,系统只启动基本的系统服务和必要的进程,仅允许 root 用户登录系统进行维护操作,常用于系统出现故障需要紧急修复的情况,比如修复文件系统错误、重置 root 密码等。运行级别 2:多用户模式,但不支持网络文件系统(NFS)。

大模型大数据攻城狮的专栏 746

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

克鲁斯卡尔(Kruskal)算法求最小生成树 1、基本思想:设无向连通网为G=(V, E),令G的最小生成树为T=(U, TE),其初态为U=V,TE={ },然后,按照边的权值由小到大的顺序,考察G的边集E中的各条边。若被考察的边的两个顶点属于T的两个不同的连通分量,则将此边作为最小生成树的边加入到T中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,

u011520601的专栏 1213

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java之克鲁斯卡尔算法求最小生成树

创建一个类EData,它的对象实例就表示一条边 public class EData { char start;//边的一个点 char end;//边的另外一个点 int weight;//边的权值 //构造器 public EData(char start, char end, int weight) { this.start = start; this.end = end; this.weight = weigh

weixin_41347226的博客 821

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

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

采用克鲁斯卡尔算法求最小生成树

目的:领会克鲁斯卡尔算法求带权连通图中最小生成树的过程和相关算法设计。 内容:编写一个程序exp8-7.cpp,实现求带权连通图最小生成树的克鲁斯卡尔算法。对于如图8.55所示的带权连通图G,输出从顶点0出发的一颗最小生成树。 [  数据结构教程(第5版)李春葆 主编   ]  第8章上机练习实验题6 代码如下: #include &lt;iostream&gt; #include &l...

君兮月影的博客 5759

利用克鲁斯卡尔算法求最小生成树

思路:最小生成树即为无向连通图G的一个子图如果是一颗包含G的所有顶点且权最小的树则称为最小生成树。克鲁斯卡尔算法的基本思想是以边为主导地位,始终选择当前可用的(所选的边不能构成回路)最小权值边。所以第一步是将所有边按照权值从小到大的顺序排序,接下来从小到大依次考察每一条边。具体实现过程如下: <1>设一个有n个顶点的连通网络为G(V,E),最初先构造一个只有n个顶点,没有边的非连通图T...

qq_43941925的博客 3702

数据结构题:克鲁斯卡尔(Kruscal)算法求最小生成树

文章目录前言一、目的与要求设计目的设计要求二、原理及方案1.2.三、设计过程1.2.四、设计结果1.2.总结 前言 问题描述:用克鲁斯卡尔算法求无向网图的最小生成树。本文编程软件使用的是Visual Studio 2019和Microsoft Visual C++ 6.0,使用的是C语言进行课程设计。 提示:以下是本篇文章正文内容,下面案例可供参考。 一、目的与要求 设计目的 该课题的源码必须能够调试成功; 提供一个main函数完成的程序源码版本。基本数据结构有详细说明,每个功能函数有详细说明; 全.

小宇y的博客 1万+

图的克鲁斯卡尔算法求最小生成树

克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。 克鲁斯卡尔算法的执行步骤: 第一步:在带权连通图中,将边的权值排序(从小到大); 第二步:判断是否需要选择这条边(此时图中的边已按权值从小到大排好序)。判断的依据是边的两个顶点是否已连通,如果连通则继续下...

aier0323305的博客 2009

prim算法求最小生成树_最小生成树克鲁斯卡尔算法

什么是最小生成树现在假设有一个很实际的问题:我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网?于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,然后,边表示两个城市的通信线路,每条边上的权重就是我们搭建这条线路所需要的成本,所以现在我们有n个顶点的连通网可以建立不同的生成树,...

weixin_39850150的博客 263

克鲁斯卡尔算法求图的最小生成树

克鲁斯卡尔算法就是:先将图中所有的边的权值,从小到大排序,然后,在不构成回路的前提下,依次选择最短的路径的边,如果加入某个边构成回路,则这条边舍弃,再接着取下一条边,直到连接所有顶点 代码: public class KruskalCase { private int edgeNum;//边的个数 private char[] vertexs;//顶点数组 private ...

weixin_43396422的博客 1234
上一篇: freopen函数
下一篇: 用普里姆算法求最小生成树
hackerain
博客等级 码龄16年 753粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值