图的最小生成树(MST)之Kruskal算法

最小生成树算法 | Kruskal’s Minimum Spanning Tree Algorithm 生成树是连通图的子集,其中所有边都是连接的,即可以从任一边遍历到任何边,中间有或没有中间节点。此外,生成树中不得有任何循环。因此我们可以说,如果一个连通图中有N个顶点,那么生成树可能具有的边数为N-1。什么是最小生成树? 阅读详情

克鲁斯卡尔(Kruskal)算法(只与边相关)

        Kruskal算法通过每次向当前最小代价生成树T中加入一条边的方法构造最终的最小生成树T。算法按照边的权值非递减顺序选取边,并将其加入T中。如果所选取的边与T中的边不形成环路,则这条边加入T中。由于图G是联通的,且具有n个顶点(n>0),所以最终恰好选取n-1条边加入T中。

实现代码:

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 50
int parent[MAX], family[MAX];
int vertex_num, edge_num;

typedef struct Edge //Edge info storage
{
	int a;
	int b;
	int weight;
};

bool cmp(const Edge & a, const Edge & b)
{
	return a.weight < b.weight;
}

int find(int x) 
{
	/* if vertex x is single : parent[x] = x family[x] = 1
	if vertex x is attached to another vertex y: 
	parent[x] = y  , family[y] = family[y] + family[x]   */
	for(;parent[x]!=x;x=parent[x])
		;
	return x; 
}

bool join(int x, int y) //join two vertex set
{
	/* vertex set join : if parent[x] = parent[y]
	vertex x and vertex y are in the same set  */
	int root1, root2;
	root1 = find(x);
	root2 = find(y);
	if(root1 == root2) //in the same vertex set
		return false;
	else if(family[root1] >= family[root2])
		{
			parent[root2] = root1;
			family[root1] += family[root2];
		}
		else
		{
			parent[root1] = root2;
			family[root2] += family[root1];
		}
	return true;
}

int main()
{
	int ltotal, sum, flag;
	Edge edge[MAX];

	scanf("%d%d", &vertex_num, &edge_num);
	ltotal = 0, sum = 0, flag = 0;
	for(int i = 1; i <= vertex_num; ++i) //initialize parent[] and family[] 
	{
		parent[i] = i;
		family[i] = 1;
	}
	for(int i = 1; i <= edge_num ; ++i)
	{
		scanf("%d%d%d", &edge[i].a, &edge[i].b, &edge[i].weight);
	}
	sort(edge + 1, edge + 1 + edge_num, cmp); //sort edge by weight of each edge
	for(int i = 1; i <= edge_num; ++i)
	{
		if(join(edge[i].a, edge[i].b))
		{
			ltotal++; // edge num increment by 1
			sum += edge[i].weight; //total weight 
			cout<<edge[i].a<<"->"<<edge[i].b<<endl;
		}
		if(ltotal == vertex_num - 1) //MST if edge num = vertex num - 1
		{
			flag = 1;
			break;
		}
	}
	if(flag) printf("%d\n", sum);
	else printf("data error.\n");
	
	return 0;
}

输入数据:

7 9
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
输入数据代表的图及Kruskal算法的结果图:


输出数据:

1->6
3->4
2->7
2->3
4->5
5->6
99
REF:

1,http://blog.youkuaiyun.com/niushuai666/article/details/6689285

2,数据结构(C语言版) Ellis Horowitz



数据结构:最小生成树—Prim(普里姆)与Kruskal(克鲁斯卡尔)算法 维度Prim 算法Kruskal 算法贪心策略顶点扩展边排序数据结构优先队列(最小堆)并查集时间复杂度(O(E \log V))(堆优化)(O(E \log E))(排序主导)适用图类型稠密图稀疏图。 阅读详情

相关推荐

算法导论随笔(十):最小生成树(MST)与Kruskal算法、Prim算法

这篇文章中我来写写图的最小生成树,以及计算一个图的最小生成树的算法,即Kruskal算法和Prim算法。两个算法均使用了贪婪策略。 1. 最小生成树 先来谈谈 最小生成树(Minimum Spanning Tree,MST) 的概念。这个概念分为三个部分:最小,生成,和树。因此,这里分别对这三个概念作出解释。首先,树的定义在算法导论随笔(四):树形结构与二叉树已经有完整介绍。这里,介绍生成树(Spanning tree)的概念。 首先,当我们以 “生成” 作为前缀来修饰一个图或一棵树时,表示的是该树和该图是

天降风云的博客 867

最小生成树之Kruskal算法

给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minimum Spanning Tree)。         我们由最小生成树的定义,可以延伸出一个修建道路的问题:把无向图的每个顶点看作村庄,计划修建道路使得可以在所有村庄之间通行。把每个村庄之间修建

Enstein_Jun 15万+

kruskal最小生成树C++代码

我自己编写的一个C++ kruskal最小生成树程序,希望可以对初学者有所帮助,错误难以避免,希望大家谅解

图 之 MST(最小生成树 — kruskal算法 )并查集实现

#并查集的优化: (1)       Find_Set(x)时,路径压缩寻找祖先时,我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度。为了避免这种情况,我们需对路径进行压缩,即当我们经过”递推”找到祖先节点后,”回溯”的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示。

PeersLee的博客 4654

kruskal算法(最小生成树聚类)MATLAB源程序

通过MATLAB实现了最小生成树算法中的Kruskal算法,而且可以通过设置阈值进行聚类(包含数据集哟)

PyTorch 深度学习实战(28):对比学习(Contrastive Learning)与自监督表示学习

本文实现了基于对比学习的自监督表征学习框架,通过 InfoNCE 损失在 CIFAR-10 数据集上学习到具有判别性的特征表示。实验表明,仅使用线性分类器即可达到 82% 以上的验证准确率,证明了对比学习的有效性。在下一篇文章中,我们将深入计算机视觉的核心任务之一——《目标检测与 YOLO 实战》,探讨如何利用深度学习实现高效的目标检测系统。

m0_60414444的博客 2383

最小生成树——Kruskal算法

 最小生成树之kruskal算法 1.kruskal算法 假设连通网N=(V,{E})。则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择最小代价的边,若该边依附的顶点落在T中不同的连通分量中,则将该边加入到T中,否则舍去此边而选择下一条代价最小的边,依次类推,直到T中所有顶点都在同一连通分量上为止。 示例如下...

weixin_30898109的博客 354

Qwen 三代进化全景对比:从 Qwen2.5 到 Qwen3 再到 Qwen3.5

本文对比了阿里巴巴通义千问三代大模型(Qwen2.5、Qwen3、Qwen3.5)的技术演进。18个月内,模型在架构、训练数据和能力上实现显著突破:从纯稠密结构(Qwen2.5)发展为混合注意力架构(Qwen3.5),支持语言从29种扩展至201种,并实现原生多模态融合。关键进展包括引入MoE架构、Gated DeltaNet混合注意力机制(计算效率提升10倍)、以及从独立模态到早期视觉语言联合训练的转变。模型阵容从7个通用尺寸发展为8+个混合架构,最大参数量达397B,上下文窗口扩展至256K(托管版1M

m0_47999117的博客 1万+

图的最小生成树MST--Kruskal算法

图的最小生成树算法中,prim算法是以顶点为单位,每次都是将xinding

尜尜君的小世界 980

Ubuntu 22.04下Colmap带CUDA支持的编译安装全攻略(附显卡架构查询指南)

本文详细指导在Ubuntu 22.04系统上从源码编译安装支持CUDA加速的Colmap,解决了官方版本无GPU支持导致处理速度慢的问题。重点包括环境依赖准备、CUDA工具链配置、显卡计算能力查询以及完整的编译安装步骤,旨在帮助研究者和开发者高效部署高性能三维重建工具。

gold8的专栏 344

解锁Jetbrains AI助手:中国开发者实战配置与效率跃迁指南

本文为中国开发者提供了一份详细的Jetbrains AI助手实战配置指南。针对服务地域限制,核心解决方案是通过修改Jetbrains账户区域信息并配置网络代理,实现插件的稳定启用。文章进一步分享了AI助手在解读遗留代码、生成中文提交信息、智能问答等场景下的具体应用,旨在帮助开发者深度集成这一工具,实现编码生产力的显著提升。

weixin_28832121的博客 574

【数据结构】六、图:5.图的最小生成树MST(普里姆(Prim)算法、克鲁斯卡尔(Kruskal)算法、Boruvka 算法)

它的基本思想是:生成树中所有顶点必然是连通的,所以两个不相交集必须连接起来才能构成生成树,而且所选择的连接边的权重必须最小,才能得到最小生成树。若(u,v)是一条具有最小权值的边,其中u∈U, v∈V-U,则必存在一棵包含边(u,v)的最小生成树。如果使用 O(mlog m) 的排序算法,并且使用 O(mα(m,n)) 或 O(mlog m) 的并查集,就可以得到时间复杂度为 O(mlog m) 的 Kruskal 算法。对于Boruvka算法,一个比较笼统的表述是,一个多路增广版本的Kruskal。

关注:https://github.com/Suhan42 1360

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9350

数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)

图的应用:最小生成树最小生成树的定义:最小生成树的性质:Prime算法:(贪心算法思想)Prime算法的代码实现原理:Prime算法的实现代码:Prime算法的性能:Kruskal算法:(贪心算法思想)Kruskal算法的实现原理:Kruskal算法的代码实现:Kruskal算法的性能: 最小生成树的定义: 最小生成树的性质: 1、不唯一性: Prime算法:(贪心算法思想) 要点: 1、...

千寻瀑 1145

大数据数据埋点技术面试题及参考答案(持续更新)

事件:指的是用户执行的具体动作,如页面浏览、按钮点击、商品购买等。事件是触发数据记录的直接原因,是分析用户行为的关键点。属性:是与事件相关的额外信息,可以提供关于事件的更多上下文。例如,用户点击的按钮颜色、大小、页面位置等。属性有助于更细致地分析用户行为,理解事件发生的具体情境。事件和属性共同构成了数据埋点的数据模型,它们使得收集的数据具有可分析性,从而可以用于深入理解用户行为和优化产品。

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

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1327

java实现图的最小生成树(森林)MST克鲁斯卡尔(Kruskal)算法

/****************************************************************************** * Compilation: javac KruskalMST.java * Execution: java KruskalMST filename.txt * Dependencies: EdgeWeightedGr

小溪科技 1367

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

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

Prim算法实现最小生成树MST(java)Prim算法是另一种生成图的最小生成树的算法,这里简单说一下Prim算法和Kruskal算法的在实现方面的区别: 1、Kruskal算法在生成最小生成树的

Prim算法是另一种生成图的最小生成树的算法,这里简单说一下Prim算法和Kruskal算法的在实现方面的区别: 1、Kruskal算法在生成最小生成树的过程中产生的是森林,Prim算法在执行过程中始终都是一棵树; 2、Kruskal和Prim实现上的最大区别是Kruskal不需要搜索每个顶点的邻接节点,而Prim中需要,所以Prim图构建时需要利用邻接链表进行构建,Kruskal不用! ...

不二的博客 562

visio安装包

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

IMSL CNL 7.0.0 (x86-64)Crack

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

【数据结构】图论基石:最小生成树(MST)实战精解与Prim/Kruskal算法详解

【数据结构】第六章——图——图的基本应用 详细介绍图的基本应用——最小生成树的相关内容,从认识最小生成树到分析最小生成树的两种构建算法——Prim/Kruskal 的基本原理,最后再由基本原理总结出算法逻辑以及算法的适用范围……

蒙奇D索大的博客 1706

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最小生成树(MST)Kruskal算法 + hdu三道例题

#最小生成树 (MST) 标签(空格分隔): 算法思想 在无向图中,连通且不含 圈 的图称为树。 给定无向图G = (V,E),连接G中所有点,且边集是E的子集的树称 为G的生成树,而权值最小的生成树称为最小生成树(MST) 常见算法: Kruskal 算法 和 Prim 算法。 圈指的是任选一个顶点为起点,沿着不重复的边,经过不重复的顶点为途径,之后又回到起点的闭合途径称为圈。(可以类似理解...

一个蒟蒻的博客 745

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【算法导论】图论(图的基本概念,图上的深度优先搜索(DFS),广度优先搜索(BFS),最小生成树(MST)及Prim,Kruskal算法)

本文主要介绍了有关图的概念,和图的遍历以及最小生成树问题

qq_73301283的博客 1612

Kruskal算法——最小生成树

题目描述 编程实现Kruskal算法,求图的最小生成树(MST)的权重。 输入 每组数据分为两个部分,第一部分为图的点数n,和边数m, 第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。 输出 最小生成树的权重。 样例输入 3 3 0 1 10 0 2 15 1 2 50 样例输出 25 代码实现 import java.util.Scanner; public class Main { //建类,边 public static class edge{ int x,y

小叮当不懒的博客 1020

poj 1679__The Unique MST(次小生成树,kruskal)

链接:The Unique MST The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24157   Accepted: 8588 Description Given a connected undirected graph

Han_zhenyu的博客 460

poj 1679 The Unique MST (判断最小生成树是否唯一)

题意:判断最小生成树是否唯一, 若唯一,输出最小权值和,否则,输出 Not Unique! 判断最小生成树是否唯一的思路: 1、对图中的每一条边,扫描其他边,如果存在相同权值的边,则对该边做标记 2、然后用Kruskal算法或Prim算法求MST 3、求得MST后,如果该MST中未包含做了标记的边,即可判断MST唯一; 如果包含做了标记的边,则依次去掉这些边的一条边,再求MST, 如果求得的MST权值和原来的MST的权值一样,即可判断MST不唯一。

happy_lcj 1413

最小生成树(Minimum Spanning Tree, MST)

以下是Prim算法在C++中的实现。这个实现使用了优先队列(堆)来选择权重最小的边,并逐步构建最小生成树。中,使得所有节点连通且总权重最小的一棵树。设置图的顶点和边,调用 Kruskal 算法并输出最小生成树。实现Prim算法,使用优先队列(最小堆)来选择最小权重的边。并查集实现,用于管理顶点集合,并支持路径压缩和按秩合并。以下是Kruskal算法在C++中的实现。:设置图的顶点和边,调用Prim算法并输出最小生成树。这个实现适用于任意无向加权图,并高效地找到最小生成树。Kruskal算法的实现。

1925
上一篇: 图的广度优先遍历
下一篇: 图的最小生成树(MST)之Prim算法
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值