kruskal最小生成树算法

【贪心算法】Kruskal算法的实现与应用 问题背景假设我们有n个位置的集合V={v1, v2, …, vn},我们想在它们顶部建立一个通信网络,网络应该是连通的,即任何两个位置vi和vj之间至少存在一条路径可以相互到达。对于确定的两个位置(vi,vj),假设在这两个位置之间建立网络连接的费用为c(i,j),c(i,j) > 0。将上述问题抽象成一个无向图G=(V,E),用图来表示可能被建立的链接的集合,图的每个结点代表每个位置,图的每条边e 阅读详情

 注意:

1、并查集的巧妙应用。

一、大致框架

1、边的数据结构定义

struct edge
{
	int u;  //u、v: 边的两个端点 
	int v;
	int cost;
}E[maxe];

2、比较函数

bool cmp(edge a,edge b)
{
	return a.cost<b.cost;
}

3、kruskal函数

int father[n];
int findFather(int x);
{
	
}

int kruskal(int n,int m)
{
	int ans=0;
	int num_edge=0;
	for(int i=1;i<=n;i++)
	{
		father[i]=i;
	}
	sort(E,E+m,cmp);
	for(int i=0;i<m;i++)
	{
		int faU=findFather(E[i].u);
		int faV=findFather(E[i].v);
		if(faU!=faV)
		{
			father[faU]=faV;                                                                                                                                                                                                                                
			ans+=E[i].cost;
			NumEdge++;
			if(Num_Edge==n-1) break;
		}
	}
	if(Num_Edge!=n-1) return -1;
	else return ans;
}

二、kruskal测试代码

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxv=110;
const int maxe=10010;

struct edge
{
	int u;
	int v;
	int cost;
}E[maxv];

bool cmp(edge a,edge b)
{
	return a.cost<b.cost;
}

//1、并查集部分
int father[maxv];
int findFather(int x) 
{
	int a=x;
	while(x!=father[x])
	{
		x=father[x];
	}
	
	//路径压缩
	while(a!=father[a])
	{
		int z=a;
		a=father[a];
		father[z]=x;
	} 
	return x;
}

//2、kruskal部分
int kruskal(int n,int m) 
{
	int ans=0;
	int Num_Edge=0;
	for(int i=0;i<n;i++)  //并查集初始化 
	{
		father[i]=i; 
	}
	sort(E,E+m,cmp);
	for(int i=0;i<m;i++)
	{
		int faU=findFather(E[i].u);
		int faV=findFather(E[i].v);
		if(faU!=faV)
		{
			father[faU]=faV;
			ans+=E[i].cost;  //加上这条边的权重 
			Num_Edge++;
			if(Num_Edge==n-1) break;
		}
	}
	if(Num_Edge!=n-1) return -1;
	else return ans;
}

int main()
{
	int n;
	int m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&E[i].u,E[i].v,E[i].cost);
	}
	int ans=kruskal(n,m);
	printf("%d\n",ans);
	return 0;
}

 

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

相关推荐

图的最小生成树之Prim算法及Kruskal算法

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

SanFancsgo的博客 5238

最小生成树------畅通工程

题目: #include <iostream> #include <algorithm> using namespace std; const int MAXV=100; const int MAXE=10010; //边集定义 struct edge { int u,v; int cost; } E[MAXE]; bool cmp(edg...

weixin_42761339的博客 274

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

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

weixin_35755640的博客 844

Kruskal 算法 最小生成树

#include<bits/stdc++.h> using namespace std; //kruskal算法 int F[1000]; int N,M; int Find(int x)//找到x的父节点 { if (x == F[x]) return x;//直接找到就返回 就一个等于号的问题 else {//没找到 就递归的找 而且找的时候 还要不断的赋值 这样下次就方便了 int f = Find(F[x]); F[x] = f; return f; .

qq_61793850的博客 283

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略

本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。

efc1234567的博客 615

海康威视Web3.0插件实战:快速部署摄像头实时预览方案

本文详细介绍了海康威视Web3.0插件的实战应用,包括快速部署摄像头实时预览方案的完整流程。从插件下载安装到摄像头连接配置,再到浏览器兼容性解决方案,帮助开发者和IT人员高效实现网页端监控功能。特别针对预览功能调优和多摄像头管理等高级应用提供了实用技巧。

weixin_29266679的博客 348

poj 最小生成树入门水题 1251 && 1258 && 1287 && 2395 && 2485 && 2377

1251: 裸最小生成树 #include//660k 0ms #include #include #include #include #include using namespace std; const int maxe=20010; const int maxv=1009; struct edge{ int u,v,w; }es[maxe]; bool cmp(edge a,edg

xiaoli_nu的博客 252

similarity network fusion for aggregating data types on a genomic scale

基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算

augustar学习笔记 7870

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

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

Eristic0618的博客 3404

关于三维全波电磁场仿真软件CST的安装和问题解决

百度网盘链接:https://pan.baidu.com/s/1RgWr8Qau1EzSOlh29SewFQ提取码:fzza这里是2023版本的CST,需要其他版本的uu们可以去官网或者其他人的网盘下载。

weixin_60728441的博客 3618

2025年7月5日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案

2025年7月5日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案

伶俐角少儿编程 901

最小生成树-Kruskal算法

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

qq_49786613的博客 2万+

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

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

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

mgsky1的博客 10万+

从基础到前沿:深度剖析光束整形与扫描技术

光束扫描的核心在于通过特定手段改变光束的传播方向,从而实现对目标区域的扫描。在这个过程中,振镜、声光偏转器、电光偏转器等元件发挥着关键作用。振镜是一种常见的光束扫描元件,它主要由电机、反射镜和透镜组成。当电机驱动反射镜旋转时,根据光的反射定律,反射镜会改变入射光线的反射方向。假设初始时光束垂直入射到反射镜上,当反射镜绕某一轴旋转一定角度时,光束的反射方向就会相应改变,从而实现光束在空间中的扫描。在激光打标设备中,通过控制振镜的快速摆动,能够使激光束在工件表面快速移动,完成各种图案和文字的标记。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2098

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

DUdU_23456的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

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

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

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

最小生成树(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的博客 2697

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

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

qq_54162207的博客 8321

最小生成树(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
上一篇: prim最小生成树算法
下一篇: 拓扑排序
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值