克鲁斯卡尔算法(kruskal)

2023-11-13

我自己感觉,克鲁斯卡尔算法比普利姆算法更好理解,它就两个要点,排序和判断是否成环。
排序:我们把两两相邻的边根据边的权值,从小到大依次排序,这个十大排序算法可以自己选一个去实现下,刚好还可以回忆下以前的算法,下面我们使用冒泡来实现边的排序。
是否成环:这个也是这个算法里比较难的一个点了,这里使用了并查集,每次添加一条边时候,我们需要去寻找这两个点是否有相同的父节点,如果有说明成环了,我们就可以选择下一条边了,直到有n-1条边。
如果不了解并查集的,可以看看下面这一篇文章,讲的很通俗易懂。 (https://zhuanlan.zhihu.com/p/93647900)
下面依然是给出关键步骤代码,基本的图数据结构可以自己动手实现哦。
//边对象
class Edata {
	private int start;
	private int end;
	private int weight;
	public Edata(int start, int end, int weight) {
		this.start = start;
		this.end = end;
		this.weight = weight;
	}
}

//还是写下图对象,也没有几行
class Graph {
	//结点数量
	private int verxs;
	//结点数组
	private char[] data;
	//矩阵图
	private int[][] weigth; 
}

//记录每个结点的父结点,初始化的时候,每个结点的父节点是它自己
private int[] rank;
//最后我们获取到的边
private Edata[] result;

public void kruskal(Graph graph) {
	//辅助索引,用来存放最后我们获取到的边;
	int index = 0;
	//获取图中所有边
	Edata[] eDatas = getEDates(graph);
	//把边按权值进行排序
	sort(edatas)
	//依次取出边
	for(int i = 0; i < eDatas.length; i++) {
		//获取结点的索引
		int m = eDatas[i].getStart();
		int n = eDatas[i].getEnd();
		//获取连个结点的父节点
		int a = getRoot(m);
		int b = getRoot(n);
		//不同就把这条边加入进去
		if(a != b) {
			//这里其实就是合并两个集合
			rank[a] = b;
			result[index++] = eDatas[i];
		}
	}
}

//获取当前结点的根节点,可以想象成一棵树,不断往上找
public int getRoot(int n) {
	while(rank[n] != n) {
		n = rank[n];
	}
	return n;
}

//冒泡排序
public void sort(Edata[] eDatas) {
	Edata[] edatas = getEDates(graph);
}

//获取边的集合
public Edata[] getEDates(Graph graph) {
	int index = 0;
	//n个结点,n-1条边
	Edata eDatas = new Edata[graph.getVerxs - 1];
	//广度遍历
	for(int i = 0; i < graph.getVerxs(); i++) {
		//把自己和前面已经生成的边排除
		for(int j = i + 1; j < graph.getVerxs(); j++) {
			edatas[index++] = new Edata(graph.getData()[i], graph.getData()[j], graph.getWeight()[i][j]);
		}
	}
	return eDatas;
}

到此克鲁斯卡尔算法算是完了,代码虽然比普利姆的多些,但是结构还是很清楚的,记住两个要点排序,是否成环就OK了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

克鲁斯卡尔算法(kruskal) 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • C# 提取字体点阵字模数据

    MCU 项目的 GUI 需要显示文字 没找到合适的 于是 用 Visual C 2008 写了一个字模提取程序 目前能导出数据 但还没来得及测试数据正确性 项目托管地址 https github com memstone mosFontTo
  • 【Flutter 2-7】Flutter手把手教程UI布局和Widget——垂直布局控件Column

    Column Column是在Flutter中常见的布局控件 它负责垂直方向布局 Row负责水平方向布局 二者都是继承于Flex 类似于iOS里面的UIScrollView 但是又有很多不同 先来看一下Column的构造函数 Column
  • 华为OD机试 Python【数字整除】

    题目 小明正在玩一种特别的牌游戏 这个游戏的玩法如下 小明先拿到一张牌 上面有一个数字m 然后 他会依次拿到n张牌 这些牌连成一排 小明的挑战是 从这n张牌中 找到连在一起的一串牌 使它们的数字和能被m整除 你的任务 对于每一轮游戏 判断小
  • DataInputStream和DataOutputStream的基本使用

    字节流 InputStream类 OutputStream类 字符流 Reader类 Writer类 DataInputStream和DataOutputStream是一对可以直接读取基本类型数据的流 简化了对基本数据类型的读写操作 Dat
  • Java常用日志框架介绍

    Java日志概述 对于一个应用程序来说日志记录是必不可少的一部分 线上问题追踪 基于日志的业务逻辑统计分析等都离不日志 java领域存在多种日志框架 目前常用的日志框架包括Log4j 1 Log4j 2 Commons Logging Sl
  • 如何将Kali Linux中的Firefox浏览器语言设置为中文

    我们在使用kali这个工具的时候 打开Firefox浏览器 对于英文不是很好的人很不友好 那么怎么设置成中文呢 其实很简单 不用通过行也可以实现 1 首先需要打开我们的Firefox浏览器 点击这里 2 选择设置 3 找到语言设置 找到中文
  • 有哪些初学者程序员不知道的小技巧?

    提到新手程序员 大家想到的第一个词可能就是 刷题 尤其是通过LeetCode刷题 想必新手程序员们都经历过这一步 甚至不少人认为只要在LeetCode上刷的题目够多 就一定能够进阶为大神 但是 不难发现 LeetCode上的题目都是算法片段
  • Java程序员最常用的6个代码对比工具,架构师一定收藏

    Java程序员最常用的6个代码对比工具 架构师一定收藏 在Java程序开发的过程中 程序员会经常对源代码以及库文件进行代码对比 那么今天在这篇文章里我们给大家介绍六款程序员常用的代码比较工具 希望对大家会有帮助 WinMerge WinMe
  • openGL之API学习(六)如何绑定深度缓冲区到片元着色器

    本质是使用帧缓冲区glBindFramebuffer GL FRAMEBUFFER m fbo 深度缓存是帧缓冲区的一个挂载点 在OpenGL中3d管线输出的结果称为 帧缓冲对象 简称FBO FBO可以挂载颜色缓冲 在屏幕上显示 深度缓冲区
  • 一文教你搞懂python函数装饰器(wrapper)

    python函数装饰器 函数装饰器 定义一个装饰器后 调用该装饰器 个人理解是在目标函数前后做一些操作 例如 定义一个鉴权的函数装饰器 在给目标函数的时候添加装饰函数就可以做到先鉴权 鉴权成功再运行目标函数 装饰器模板参考如下 模板 装饰器
  • 禅道bug等级说明

    禅道Bug等级划分标准 一 严重程序 P1 致命 该问题在测试中较少出现 一旦出现应立即中止当前版本测试 阻碍开发或测试工作的问题 造成系统崩溃 死机 死循环 导致数据库数据丢失 与数据库连接错误 主要功能丧失 基本模块缺失等问题 如 代码
  • matlab 虚数 .,关于MATLAB在复数方面的应用 – MATLAB中文论坛

    最近 看到有不少朋友问MATLAB在复数方面的应用问题 特此发个帖子 给大家分享点资料 matlab在复数中的应用 1 复数的生成 复数生成语句 其中theta为复数辐角的弧度值 r为复数的模 z a b i z a bi z r exp
  • 小程序上传图片(拍照或从相册选择)chooseMedia

    let that this wx chooseMedia count 1 最多可以选择的图片张数 默认9 mediaType image sourceType album camera success res console log res
  • CSS flex 属性

    flex basis flex basis属性规定弹性项目的初始长度 那么我们随便写一串简单的代码来看看flex basis的效果如何 代码如下
  • DVWA low难度全通关

    low难度 1 暴力破解 抓包 破解成功 2 命令执行 我们可以用通道符绕过 也行 3 跨站请求伪造 这里把url发给登陆了的用户 就可以密码修改成功了 4 文件包含 通过这样来访问到phpinfo php 5 文件上传 毫无防备 可以直接
  • Python目前建议最好安装什么版本的?

    Python2 7及以前的版本 已经被淘汰了 图片来源 Python1 1 1 6下载地址 https www python org download releases 在Python1 5 2版本之前 Python官网只提供源代码的下载
  • 使用stream将List转换为用逗号拼接的字符串

    摘要 有时候需要将List中的元素转换为用逗号拼接的字符串 很简单的实现 略略写一下stream的实现 实现 使用stream实现 public void test List
  • Linux多线程:线程分离

    第三方的线程库 Compile and link with pthread The pthread detach function marks the thread identified by thread as detached When
  • python14异常处理

    1 错误 有的错误是程序编写有问题造成的 比如本来应该输出整数结果输出了字符 串 这种错误我们通常称之为 bug bug 是必须修复的 有的错误是用户输入造成的 比如让用户输入 email 地址 结果得到一个空字 符串 这种错误可以通过检查
  • 克鲁斯卡尔算法(kruskal)

    我自己感觉 克鲁斯卡尔算法比普利姆算法更好理解 它就两个要点 排序和判断是否成环 排序 我们把两两相邻的边根据边的权值 从小到大依次排序 这个十大排序算法可以自己选一个去实现下 刚好还可以回忆下以前的算法 下面我们使用冒泡来实现边的排序 是