最小生成树----Kruskal算法&并查集

图算法 最小生成树邻接表 Kruskal算法(并查集) 之前对最小生成树Prim算法进行了一定的总结,并给出了代码实现,详见:图的最小生成树,Prim实现。 一、介绍    由于忙于各类事务,在算法方面的学习有所停滞,现在将求最小生成树的另外一种算法补上,也就是Kruskal算法。有关最小生成树算法正确性的证明见上面链接。   Kruskal算法是一种实现起来较为简单,比较容易理解的算法,在图较为稀疏时能够获得很好的性能, 阅读详情

对于图寻找最小生成树

顶点v使用并查集,初始状态下所有顶点都是一个集合。

Kruskal算法描述:

取最短的边,比较是否两个顶点都在同一集合内:如果都在,则舍弃


初始化时,v长这样

v = [i for i in xrange(0, length)] 
并(i, j)的操作就是合并两个集合的跟:

r_i = find_root(v, i)
r_j = find_root(v, j)
v[r_j] = r_i

查找操作中,我增加了路径压缩,使得效率能提升

def find_root(d_set, key):
	if d_set[key] == key:
		return key
	# flat
	root = key
	cur_key = key
	while d_set[cur_key] != cur_key:
		root = d_set[cur_key]
		cur_key = root
	d_set[key] = root
	return root

最后是kruskal的算法了:

def kruskal(graph):
	# only traverse half of the graph
	# because graph is undirected
	length = len(graph)
	# init
	edge_info = []          # (weight, i, j) list
	for i in xrange(0, len(graph)):
		for j in xrange(0, i):
			if graph[i][j]:
				edge_info.append((graph[i][j], i, j))
	edge_info.sort()

	v = [i for i in xrange(0, length)]     # disjoint set
	e = []
	for (_, i, j) in edge_info:
		r_i = find_root(v, i)
		r_j = find_root(v, j)
		if r_i == r_j:
			continue
		# union
		v[r_j] = r_i
		e.append((i, j))
	return e

驱动

graph = [[0, 7, 9,  0,  0, 14],
         [7, 0, 10, 15, 0, 0],
         [9, 10, 0, 11, 0, 2],
         [0, 15, 11, 0, 6, 0],
         [0, 0,  0,  6, 0, 9],
         [14, 0, 2, 0,  9, 0]]
print kruskal(graph)

排序需要O(Edge * log(Edge)),查找时是O(Edge * 接近常数的数)

最终时间复杂度为O(Edge * log(Edge))



最小生成树模板 洛谷 Prim算法和Kruskal算法 洛谷-最小生成树模板 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz。 输入格式 第一行包含两个整数N,M,表示该图共有N个结点和M条无向边。 接下来MM行每行包含三个整数Xi,Yi,Zi ,表示有一条长度为Zi​的无向边连接结点 Xi​,Yi​。 输出格式 如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通... 阅读详情

相关推荐

手把手教你用FPGA驱动DAC8830:一个Verilog SPI驱动模块的完整实现与调试

本文详细介绍了如何使用FPGA通过Verilog实现DAC8830的SPI驱动模块,包括SPI通信机制解析、Verilog模块设计、代码优化及调试技巧。重点解决时钟同步、状态机设计等工程实践问题,适用于音频处理、仪器仪表等高精度数模转换场景。

weixin_26886855的博客 229

Kruskal算法与并查集

Kruskal算法与并查集 一、Kruskal算法 1、 概念 Kruskal算法就是按照图中各个边上的权值大小进行递增排序,以此来构造最小生成树。 2、重点解析 在由Kruskal实现最小生成树的过程中,难以理解的就是其中的判断边与边是否形成环路的问题,本文主要对此进行一定的介绍。 首先我们要知道,在Kruskal实现最小生成树的算法中利用到了并查集的概念,这个概念搞不懂是很难理解此算法的。 在Krusal算法中,parent(判断边与边是否形成环路的数组)就像是个并查集,如果

qq_51458770的博客 1589

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8765

数据结构之Kruskal算法(并查集的应用)

Kruskal算法基本思想 假设G=(V,E)是连通图,将G中的边按权值从小到大的顺序排列 1、将n个顶点看成n个集合 2、按权值从大到小的顺序选择边,所选边应满足两个顶点不在同一个顶点集合内,即加入此边后不会在生成树中产生回路,将该边放到生成树边的集合中。同时将该边的两个顶点所在的顶点集合合并。 3、重复2,直到所有的顶点都在同一个顶点集合内。 举个例子 1、首先比较图中

摩尔的博客 1886

REALTEK PKE8710ECF开发板入手试玩(一)

REALTEK PKE8710ECF开发板入手试玩

lbqhope的专栏 691

OpenClaw Browser Relay Extension 鉴权失败与 invalid handshake 问题的终极解决方案

在使用 OpenClaw 浏览器插件 (Browser Relay Extension) 时,许多用户可能会遇到两个主要问题:一是配置端口错误导致的连接失败,二是鉴权失败 (Gateway token rejected)。本文将详细解析这两个问题并提供解决方案。

gerryke的blog 5559

最小生成树的KrusKal算法(含并查集)

最小生成树 概念:图的生成树是它的一棵含有其所有顶点的无环连通子图,一副加权无向图的最小生成树它的一棵权值(树中所有边的权重之和)最小的生成树。 相关引申概念: 加权无向图:在无向图的基础上,我们只需要把边的表示切换成Edge对象即可。 最小的生成树:最小生成树,则意味着加入树的所有边权值之和为最小,而且不存在构成环的边加入 KrusKal算法:将加权无向图中的所有边进行排序,每次选取权值最小的边,判断边的两端点是否在已经加入最小生成树(此处判断运用到了并查集)(如果加入,就找下一个权值最小边)直到构成最小

lay523的博客 877

从零配置到批量处理:FaceFusion 3.1完整使用指南(含hififace_256模型测试)

本文详细介绍了FaceFusion 3.1的完整使用指南,包括环境配置、模型选择(特别是hififace_256模型的深度测试)以及批量处理技巧。通过AI驱动的脸部替换技术,帮助用户高效实现高质量的面部处理,适用于影视制作、广告设计等多种场景。

weixin_29056865的博客 655

Kruskal算法解决最小生成树与并查集详解

给定一个无向连通图,每条边都有权值,我们要:选出一些边,使得:所有节点都被连接(连通)没有环(树结构)总权值最小最小生成树举个例子A/ \1 4/ \B---2---C你会选:A-B(1)B-C(2)而不是 A-C(4)总权值最小:1 + 2 = 3Kruskal 核心:排序边贪心选最小用并查集防止成环并查集核心:find:找祖先union:合并集合用来判断是否连通Kruskal = 贪心 + 并查集并查集 = 判断“会不会成环”

2302_80130505的博客 381

abapGit 安装与初始化完整指南:从 on-premise 到 SAP BTP ABAP environment 的一条龙实践

本文为ABAP开发者提供abapGit从安装到团队协作的完整指南。内容涵盖社区版ZABAPGIT的on-premise安装、Eclipse ADT插件配置、BTP环境使用及常见网络问题处理。重点包括:获取最新构建的安装步骤、EN语言环境的重要性、ADT插件安装方法、以及如何实现on-premise与BTP间的代码迁移。文中特别强调企业环境下代理设置、证书配置等注意事项,并提供实际操作案例,如将RAP业务对象迁移到BTP环境。文末附有可复用的实施清单,帮助开发者快速落地abapGit。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 414

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

克鲁斯卡尔算法、并查集

1. 并查集 看《大话数据结构》中的克鲁斯卡尔算法时一直没能真正理解代码含义,关键是因为没搞懂并查集,直到看了这篇文章。 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。对于图中的两个顶点A和B,通过并查集可以判断是否AB之间是否有路径。同时,也可以判断将A和B相连之后是否可以形成环,因为如果AB之间有路径的话,那么再将A和B相连就会出现环。 并查集的基本操作包括:初始化,查找...

princeteng's blogs 4170

EMB电子机械制动器夹紧力预估策略分析

本文探讨了电子机械制动器(EMB)夹紧力的四种预估方法:1)基于电机电流的方法简单经济但易受干扰;2)基于位置传感器的方法实时性好但依赖模型精度;3)直接力测量精度最高但成本较高;同时提出未来将结合AI和数字孪生技术提升预估精度。研究显示,准确的夹紧力预估对制动安全性、能效和舒适性至关重要,当前面临温度稳定性、参数漂移等技术挑战。随着智能算法的发展,EMB夹紧力预估将实现更高精度和可靠性。

m0_59012156的博客 851

并查集&最小生成树Kruskal算法

杭电oj1233 还是畅通工程 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( &...

hhdmw的博客 313

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

并查集,最小生成树-K\P算法实现

最小生成树:即在可走遍所有树节点的情况下,边权重之最小的求和; K算法实现: -并查集实现(K算法中运用到的结构) //并查集 public class UnionFind { /* 作用:用来满足二种结构---本身也是一种数据结构 ①isSameSet结构,这个结构是用来查找两个元素是否属于一个集合 ②union结构,就是把两个集合合并成一个大集合 */ /* 实现逻辑: 每个集合的每个元素都有一个node,包含-元素的value值和它的上级指针

qq_46845390的博客 408

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

DUdU_23456的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树

目录 一、Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边。这里的关键就是如何判断"将它加入生成树中不产生回路"。 二、Kruskal算法思想: Kruskal算法将每一个顶点都初始化为一棵树,并定义一棵MST树用来存储每次合并后的图结构。每次循环寻找权重最小的边,如果这条边的添加不会形成回路,那么在MST树中添加相应的边。如果这条边添加后会在MST中形成回路,那么忽略这条边。当所有边都被检索完毕后

weixin_52375817的博客 6600

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

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

Eristic0618的博客 3404

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

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

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

Kruskal算法求最小生成树(并查集讲解)

这个跟前者Prim算法目前我学来的都是为了求最小生成树,不过在看y神的视频讲解后发现还是需要一些前置知识的。

m0_51547272的博客 1379

基于并查集+Kruskal算法的matlab程序及最小生成树绘图

学了一天最小生成树,稍稍总结一下,这是第一篇 kruskal算法关于kruskal算法已有大量的资料,不再赘述,算法流程为:得到邻接矩阵和权值; 初始化,连接距离最小的两点; 连接距离次小的两点,如果形成回路则取消连接;重复上述连接步骤,直到所有n个节点被n-1条边连接成树。 并查集关于并查集的可以看一下这篇:《一个很有意思的并查集详解》。 下面给出两个子函数,一个用于寻找根节点(RootNode

qq_24694761的博客 5155

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

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

weixin_58663649的博客 2263

kruskal算法透彻理解(含并查集及最小生成树的解释)

克鲁斯卡尔(kruskal)算法通常用于求出一个连通图中的最小生成树,本文会对这种算法以及该算法的基础(最小生成树、并查集)进行详细的介绍。

单精度的梦 2万+

java算法kruskal——求最小生成树

最小生成树的经典算法有prim和kruskal,本人比较懒,选了学习实现比较方便的kruskal算法。 算法演示: 画图太费劲,文字演示一遍: 1到2 边长1 3到6 边长4 2到4 边长5 3到5 边长7 1到3 边长12 总权值:1+4+5+7+12 = 29 ———————————————————— 算法实现思路: 第一步,对收集的边长数组进行升序处理 第二步,循环每一组边长,用并查集检查两个点是否是同一个集合的(是否拥有同一个领袖),不是的话就说明可以加入最小生成树。 ———

weixin_44919936的博客 2566

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

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

zgsdlr的博客 3554

并查集——最小生成树算法Kruskal

连通图: 在无向图中,若任意两个顶点ViV_iVi​和VjV_jVj​都有路径相通,则称该无向图为连通图强连通图: 在有向图中,若任意两个顶点ViV_iVi​和VjV_jVj​都有路径相通,则称该有向图为强连通图连通网: 在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权值,权值代表着连接各个顶点的代价,称这种连通图叫做连通网生成树: 一个连通子图,它包含连通图中全部n个顶点,有n-1条边。如果生成树中再添加一条边,则必定成环最小生成树: 在连通网的所有生成树中,所有边的代价之和最小的生成树

长期更新自学笔记 1940
上一篇: 最小生成树----Prim算法+loose操作
下一篇: 声明
圆形毕露
博客等级 码龄17年 20粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值