图的最小生成树kruskal算法总结

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


kruskal算法的思想

假如N={V,{E}}是连通网,那么最小生成树的初始状态是由V个顶点自成连通分量构成的一片森林。在E中选择权值最小的边,当该边对应的两个顶点在不同分量时,则将该边加入到最小生成树中,否则的舍去,再选择下一条代价最小的边,如此循环,直到所有的连通分量连接变成一个连通分量为止。


看看具体代码

public void minSpanTree_kurskal(Edges[] edges){  //edges已按照权值大小进行了非递减排序
		
		Integer parent[] = new Integer[edges.length];
		int n,m;
		for(int i=0;i<edges.length;i++){   //初始化parent[]全部元素为0;
			parent[i] = 0;
		}
		
		for(int i=0;i<edges.length;i++){
			n = find(parent,edges[i].begin);  //寻找edges[i].begin所在连通分量的根顶点
			m = find(parent,edges[i].end);  //寻找edges[i].end所在连通分量的根顶点
			
			if(n!=m){      // 如果根结点不同说明dges[i].begin和dges[i].end在不同分量上
				parent[n] = m;
				System.out.println("begin="+edges[i].begin+","+"end="+edges[i].end+","+"weight="+edges[i].weight);
			}
		}
			
	}
private int find(Integer[] parent, int f) {
		
		while(parent[f]>0)
			f = parent[f];
		return f;
		
	}



这里存在一个问题:如何判断2个顶点在同一个连通分量?

每个连通分量上都有一个顶点代表整个连通分量,我们把它叫做根顶点,也就是通过find()方法我们可以找到该顶点所在连通分量的根顶点,如果两个顶点的根顶点相同,则代表这两个顶点在同一个连通分量上,反之则不是。

算法运行详解

1.用边集数组存储图,然后再按照权值大小进行非递减排好序,结果如下图所示




2.初始化parent[],结果如下图

值全部为0也就代表每一个顶点自称一个连通分量


3.取权值最小的边


4.调用find方法得到顶点所在连通分量的根顶点

注:其实每个连通分量的全部顶点可以看成类似树,但此树的边总是从子结点指向父节点,最后树的根即为根顶点,

如当循环到edges[6]时,有如下图所示结果


如上图所示,通过parent[]数组可以画出两个类似树的连通分量,其中7和6分别为森林中两个不同的连通分量的根顶点。如要判断顶点5所在连通分量的根顶点是什么,图中可看到5的父结点为8,8的父节点为6,6的父结点为空,说明6即为连通分量的根节点。


5.如果两个顶点的根顶点不同,说明两个顶点在不同的连通分量上,将该边加入最小生成树中,否则舍弃。


6.取最小权值的边不断循环......







Kruskal算法构造图的最小生成树 Kruskal算法的思想是: 假设联通网T=(V,{E}),则最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点位于不同的连通分量中,则将该边加入T中,否则舍去该边而选择下一条代价最小的边。一次类推,直到T中所有的顶点都在同一个连通分量为止。 以下给出代码: 1、用数组实现,指定图的结点数和弧数 #in 阅读详情

相关推荐

图的最小生成树-Kruskal算法

【问题描述】 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法。 【输入形式】 输入图的顶点序列及图的边的情况。如样例所示。边的输入以输入-1,-1,-1作为结束。 0,1,6表示对应的顶点及边是:A到B的边权值为6. 【输出形式】 输出图的最小生成树

AIGC 1244

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

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

DUdU_23456的博客 2万+

图的最小生成树算法: Prim算法和Kruskal算法(C++)

本文介绍图论中最小生成树算法, 包含Prim算法和Kruskal算法. 通过代码和图解希望能帮助读者理解.

一些C++相关的技术笔记或者教程. 1306

最小生成树-Kruskal算法

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

qq_49786613的博客 2万+

VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA

本文主要针最近比较经典的VLA算法进行对比总结,暂不涉及到代码细节和实验细节上的展开,仅仅是从大面上掌握下目前VLA的一些思路和方法。

weixin_44580210的博客 9492

离线安装samba与配置(.tar方式安装)

个人记录

小道士写程序 7721

kruskal算法

kruskal算法求最小生成树

weixin_56265979的博客 2629

水文模型大合集---SWAT模型、VIC模型、HEC-HMS模型、HSPF模型、FVCOM模型、Delft3D模型、HYPE模型.......

1.1 面源污染概要1.2 SWAT模型及应用1.3 SWAT模型原理1.4 SWAT模型输入文件1.5 ArcGIS与SWAT关系。

jwwkyjspt的博客 4358

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

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

weixin_46497503的博客 2675

SDM660电源部分配置:

SDM660电源部分配置: Panel power supplies 1、Reference power supplies Description Name Regulator Voltage (V) Panel power supply 0 vddio PMIC 660/L11 1.8 Panel power supply 1 Lab PMIC 660/lab 4.6 Panel power s...

weixin_41811215的博客 4728

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法。

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法

weixin_42960380的博客 2500

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

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

zgsdlr的博客 3554

20道SpringSecurity常见面试题汇总(超详细回答 !!!)

本文中,我们将探讨一些与 Spring Security 相关的面试问题。Spring Security 是一款流行的 Java 应用程序安全框架,它提供了一套全面且易于使用的安全解决方案。

小斜同学的博客 3076

图详解第三篇:最小生成树(Kruskal算法+Prim算法)

最小生成树:Kruskal算法+Prim算法

m0_70980326的博客 2万+

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 436

2026 最新安全 Skill 合集(CTF / 审计 / 渗透 / 红队)威胁建模一网打尽

2026年安全领域进入"Skill化"时代,各类安全能力被结构化封装为可复用的AI Skill。本文介绍了7个核心安全Skill项目:渗透测试全流程的AgentSkillsHub、CTF解题技能库ctfskills、多语言代码审计工具codeaudit、PHP专项审计系统、Java自动化审计流水线、威胁建模工具threatmodeling以及覆盖30+领域的Anthropic-Cybersecurity-Skills。这些项目将传统安全经验转化为标准化、可验证、可自动执行的模块化能力,支

Chengbei11的博客 1865

数据结构——图及其C++实现(2)最小生成树Kruskal算法和Prim算法

在上一篇文章中,我们对图的基本概念和图的存储结构及两种遍历方式做了了解,既然已经认识了图,那么对于图中的顶点来说,我们思考当面临“用最小代价把所有点连起来”这类问题时,我们该如何做?接下来我们我们引出关于图的另一个很重要的概念——最小生成树。

学习日记 749

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

图的最小生成树:Prim算法和Kruskal算法

1. 图的最小生成树 生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍历,可以得到不同的生成树。 其中,权值最小的树就是最小生成树。 关于最小生成树最经典的应用模型就是城市通信线路网最小造价的问题:网络G表示n个城市之间的通信线路(其中顶点表示城市,边表示两个城市之

jinzhao1993的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

前面介绍了图的最小生成树的Prim算法,这个算法是从顶点的角度来刻画生成树的。今天要说的Kruskal(克鲁斯卡尔)算法,是从边的角度来进行刻画的。 Kruskal算法用到的数据结构有: 1、边顶点与权值存储结构(即图是由连接某一条边的两个顶点,以及这条边的权值来进行存储,具体看后面的例子) 2、并查集(具体是什么以及作用在后面的例子中解释) Kruskal算法步骤 – 我们今天要实现的目标依然与...

qq_44134712的博客 1275

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

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

图之最小生成树Kruskal算法详解(C语言版)

Kruskal算法(克鲁斯卡尔算法)查找最小生成树的方法是:将连通网中所有的边按照权值大小做升序排序,从权值最小的边开始选择,只要此边不和已选择的边一起构成环路,就可以选择它组成最小生成树。对于 N 个顶点的连通网,挑选出 N-1 条符合条件的边,这些边组成的生成树就是最小生成树。

qq_44075108的博客 8045

图 - 最小生成树算法 - Kruskal - Prim

图 - 最小生成树算法 - Kruskal(克鲁斯卡尔) - Prim(普利姆)

2302_80023639的博客 869

图的最小生成树Kruskal算法

/ 存储图中的所有节点,键为节点值,值为节点对象。// 存储每个节点的父节点。// 邻接表,存储与该节点相连的其他节点。// 存储从该节点出发的边。// 获取起始节点和终止节点的对象。

2401_83010439的博客 534

C++ 图 Kruskal最小生成树算法

权值排序,依次取出,判断闭环 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <fstream> #include <sstream> #include <cassert> #include <vector> #in...

牛~ 294

prim算法_图的最小生成树Kruskal算法

昨天说了图的最小生成树的其中一种算法,Prim算法,今天就再来说一下平时用的比较多的另一种最小生成树算法,Kruskal(克鲁斯卡尔)算法。然后再来比较一下这两个算法之间的差异。首先回顾一下最小生成树到底是个什么东西。简单说就是在有权连通图中,找到一组边,把所有的点连接在一起,并且这组边的权值加和最小,就是这个图的最小生成树。效果大概如下图,图1,图2就是生成树,而图3因为边的权值加起来...

weixin_39878716的博客 101

kruskal算法求图的最小生成树c语言,利用Kruskal算法求图的最小生成树.doc

利用Kruskal算法求图的最小生成树利用Kruskal算法求图的最小生成树程序设计 2007-10-09 22:23 阅读160 评论1 字号: 大大 中中 小小 /*利用Kruskal算法求图的最小生成树(2007.8.7)*/#include#include#define MaxVertexNum 12#define MaxEdgeNum 20#define MaxVal...

weixin_39610964的博客 464
上一篇: 一步一图一代码,一定要让你真正彻底明白红黑树
下一篇: TCP三次握手图解与实践总结
ZengBlog
博客等级 码龄10年 29粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值