Java版-图论-最小生成树-Kruskal算法
实现描述
为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。
实现代码
- 首选我们对所有的边,按照权重排序;
- 之后,从小到大选择边,如果当前的边已经连通过了,则放弃此边,查看下一条边;若没有连通过,通过并查集进行连通;
- 直至所有点都访问过,此时,完成。

如上图,节点0~5,边关系如上;
先对边权重进行从小到大排序,得到:
[{"u":4,"v":5,"weight":1
},{"u":0,"v":5,"weight":3
},{"u":1,"v":2,"weight":4
},{"u":0,"v":1,"weight":5
},{"u":2,"v":3,"weight":5
},{"u":3,"v":4,"weight":5
},{"u":3,"v":5,"weight":6
},{"u":0,"v":3,"weight":7
},{"u":0,"v":2,"weight":8
},{"u":2,"v":5,"weight":9
}]
然后依次选择排序后的边:

下面代码对应上图数据及其过程:
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.jetbrains.annotations.NotNull;import java.util.*;public class kruskal {/*** 边定义*/@Data@AllArgsConstructor@NoArgsConstructorstatic class Edge implements Comparable<Edge> {int u, v;int weight;@Overridepublic int compareTo(@NotNull Edge o) {return weight - o.weight;}}static List<Edge> getKruskalEdges(int nodeNum, int[][] grid) {List<Edge> result = new LinkedList<>();List<Edge> edges = new LinkedList<>();for (int i = 0; i < grid.length; i++) {int u = grid[i][0];int v = grid[i][1];int weight = grid[i][2];edges.add(new Edge(u, v, weight));}Collections.sort(edges);UnionFindTemplate uf = new UnionFindTemplate(nodeNum);Set<Integer> visited = new HashSet<>();for (Edge edge : edges) {if (uf.connected(edge.u, edge.v)) {continue;}uf.union(edge.u, edge.v);visited.add(edge.u);visited.add(edge.v);result.add(edge);if (visited.size() == nodeNum) {break;}}return result;}public static void main(String[] args) {int nodeNum = 6;int[][] grid = {{0, 1, 5},{0, 5, 3},{0, 3, 7},{0, 2, 8},{1, 2, 4},{2, 5, 9},{3, 5, 6},{2, 3, 5},{3, 4, 5},{4, 5, 1}};System.out.println(JSONObject.toJSONString(getKruskalEdges(nodeNum, grid)));}
}
其中,并查集模版的实现如下:
public class UnionFindTemplate {int[] parent;int[] size;int n;public int setCount;//连通分量个数public UnionFindTemplate(int n) {this.n = n;this.parent = new int[n];this.size = new int[n];setCount = n;Arrays.fill(this.size, 1);for (int i = 0; i < n; ++i) {parent[i] = i;}}public int findParent(int x) {if (parent[x] == x) {return x;} else {parent[x] = findParent(parent[x]);return parent[x];}}public void union(int x, int y) {x = findParent(x);y = findParent(y);if (x == y) {return;}if (size[x] < size[y]) {int temp = x;x = y;y = temp;}//y合并到xparent[y] = x;size[x] += size[y];setCount--;}public boolean connected(int x, int y) {x = findParent(x);y = findParent(y);return x == y;}}
相关文章:
Java版-图论-最小生成树-Kruskal算法
实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边,…...
计算机网络知识总结
1.网络协议是什么? 在计算机网络要做到有条不紊地交换数据,就必须遵守一些约定好的规则,比如交换数据地格式,是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层:为计算机用户提供服务表示层&…...
普通算法——欧拉筛
欧拉筛 思路: 对欧拉筛的实现,主要是依靠一个数组模拟的栈来实现,核心思路为用栈储存已经发现的素数 在之后的遍历中,即可以素数数组中的数为因数来筛出此素数的倍数 遍历是以当前的 i i i 值为基数,来乘当前素数数…...
【知识科普】DNS(域名解析服务)深入解读
文章目录 概述一、基本概念二、域名解析的原理三、域名解析的类型四、域名解析的常见问题及解决方法五、域名解析的重要性 部署一、准备环境二、安装DNS软件三、配置DNS服务器四、测试DNS解析五、维护和管理DNS服务器 配置文件一、BIND DNS服务器配置文件格式二、Windows系统DN…...
数据结构第一弹-数据结构在不同领域的应用
大家好,今天和大家一起总结一下数据结构在不同领域和场景的应用~ 不同的数据结构适用于解决不同类型的问题,从简单的数组到复杂的图结构,每种数据结构都有其独特的应用场景。 1. 数组与链表 1.1 概念 数组:一种线性数据结构&a…...
如何创建基于udp的客户端和服务端
1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…...
ThinkPHP框架审计--基础
基础入门 搭建好thinkphp 查看版本方法,全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…...
Java8 CompletableFuture异步编程
文章目录 CompletableFuturede介绍CompletableFuturede使用场景常用异步编程实现方案- Thread- ExecutorService- CountDownLatch- CyclicBarrier- ForkJoinPool- CompletableFuture各种实现方案总结 CompletableFuturede结构结构梳理- Future接口- CompletionStage接口常用方法…...
Java的Mvc整合Swagger的knife4框架
Swagger的介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述 文件可以去更…...
分阶段构建在复杂系统中的应用:以推荐系统为例
引言 在信息技术飞速发展的今天,复杂系统的构建已经成为许多企业和组织面临的重要挑战。复杂系统通常由多个相互依赖、相互作用的组件构成,这些组件在功能上相互关联,形成了一个高度耦合的整体。对于这样的系统,采用分阶段构建的…...
2024年12月9日历史上的今天大事件早读
1447年12月9日 中国明朝皇帝明宪宗出生 1824年12月9日 西属美洲独立战争的阿亚库乔之战爆发 1882年12月9日 中国清代数学家李善兰逝世 1917年12月9日 葡萄牙共和政府垮台 1935年12月9日 红军表示与东北抗联军一致抗日 1935年12月9日 “一二九”运动爆发 1941年12月9日 中…...
快捷构建AI大模型,源码自取可直接运行
Node.js 和 WebSocket 实现一个基于kimi(Moonshot 月之暗大模型)的AI工具 前端:前端界面比较容易,只需要简单的额css js即可,本文使用vue作为作为demo。 后端:我java很垃圾,写不出好的代码&am…...
怎么为开源项目做贡献提PR?
GitHub 慢的话,https://ask.csdn.net/questions/8166374 复刻项目 以 https://github.com/open-frame/uniapp-init 项目为例 复刻完就会在你的仓库里有个同样的项目 拉取复刻下来的项目 然后常规的改动项目、git推送。比如我改了一个忽略文件: 提交…...
如何在 JavaScript 中设置定时器?
在 JavaScript 中,设置定时器通常使用两个内置的函数:setTimeout() 和 setInterval()。它们允许你在指定的时间延迟后执行某个函数或者以某个间隔反复执行某个函数。下面,我将结合实际项目代码示例讲解如何使用它们。 1. setTimeout() — 延…...
【学习路线】Java
Java基础 基础 基础语法 面向对象 集合框架 JCF 进阶 并发编程 JVM 企业级开发 框架 Spring Boot Spring Cloud 分布式 高性能 高可用 安全 基建 Docker 实战 数据库 MySQL Redis 计算机基础 计算机组成原理 操作系统 计算机网络 数据结构与算法 设计模式 参考:…...
[GYCTF2020]Easyphp
[GYCTF2020]Easyphp 知识点 反序列化 、字符逃逸 解题 审代码 <?php error_reporting(0); session_start(); function safe($parm){$array array(union,regexp,load,into,flag,file,insert,"",\\,"*","alter");return str_replace($arr…...
JavaScript 数组的高级用法与最佳实践
在前端开发中,JavaScript 数组是不可或缺的工具。它们不仅用于存储数据,还提供了丰富的方法来操作和处理这些数据。掌握 JavaScript 数组的高级用法和最佳实践对于编写高效、可维护的代码至关重要。本文将深入探讨 JavaScript 数组的高级用法,…...
通信协议 http、tcp、udp
目录 1. 五层网络协议 2. http 3. tcp、udp 4. tcp 3次握手、4次挥手 5. socket 6. httpclient 遇到的问题 1. Q: 使用 EntityUtils.toString(responseEntity, "UTF-8") 中文乱码 2. Q: org.apache.http.NoHttpResponseException: 221.6.16.203:8890 failed …...
Scala的隐式对象和隐式类
1.隐式对象 object Test1 {case class DatabaseConfig(drive:String,url:String)//隐式对象//格式:就是在对象前面加一个 implicit//作用:给函数当默认值implicit object MySqlConfig extends DatabaseConfig("sqlserver.jdbc","localhost:3306")//定义一…...
【AIGC】2016-ACCV-即时追捕:自然环境下的自动唇音同步
2016-ACCV-Out of time: automated lip sync in the wild 摘要1. 引言1.1 相关作品 2. 表示和架构2.1 音频流2.2 视觉流2.3 损失函数2.4 训练 3. 数据集3.1 编制训练数据 4. 实验4.1 确定口型同步误差4.2 应用:主动说话人检测4.3 应用:唇读 5. 结论参考文…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果