当前位置: 首页 > news >正文

ruskal 最小生成树算法

 https://www.lanqiao.cn/problems/17138/learning/

并查集+ruskal 最小生成树算法

Kruskal 算法是一种用于在加权无向连通图中寻找最小生成树(MST)的经典算法。其核心思想是基于贪心策略,通过按边权从小到大排序并逐步选择边,确保最终形成的树满足以下条件:

  1. 包含图中所有顶点(即生成树)。
  2. 边权之和最小(即最小性)。
  3. 不形成环路(确保是树结构)。

算法步骤

排序边:将图中所有边按权值从小到大排序。

初始化并查集:每个顶点初始时属于独立的集合,用于检测环路。

遍历选边:依次遍历排序后的边,若当前边的两个顶点不属于同一集合,则选择这条边加入最小生成树,并将两个顶点的集合合并;若属于同一集合(选边会形成环路),则跳过这条边。

终止条件:当选取的边数达到 顶点数 - 1 时,算法终止,此时已得到最小生成树。

关键数据结构:并查集(Union-Find)

作用:高效判断两个顶点是否连通(属于同一集合),并快速合并集合,确保算法时间复杂度为 O(E log E)(E 为边数)。

查找(Find):确定顶点所在的集合根节点。

合并(merge):将两个不同集合合并为一个集合。

package lanqiao;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Main {static int[] union;public static void main(String[] args) {// TODO Auto-generated method stubScanner scan=new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();List<int[]> list=new ArrayList();for(int i=0;i<m;i++) {int[] arr=new int[3];arr[0]=scan.nextInt();arr[1]=scan.nextInt();arr[2]=scan.nextInt();list.add(arr);}//并查集初始化union=new int[n+1];for(int i=1;i<=n;i++) {union[i]=i;}//Kruskal 最小生成树算法list.sort(((a,b)->a[2]-b[2]));int edgs=0;int max=Integer.MIN_VALUE;for(int[] arr:list) {int x=find(arr[0]);int y=find(arr[1]);if(x!=y) {edgs++;max=Math.max(max, arr[2]);merge(arr[0],arr[1]);}// 如果已经添加了n-1条边,说明已经得到了最小生成树,输出最大边权并结束程序if(edgs==n-1) {System.out.println(max);return;}}System.out.println(-1);}//查找public static int find(int x) {if(x!=union[x]) {union[x]=find(union[x]);  //路径压缩优化,使在递归过程中,//直接把arr[x]变为根结点,从而减少下一次查询的时间}return union[x];}//合并public static void merge(int x,int y) {x=find(x);y=find(y);if(x!=y) {union[x]=union[y];  //把y的根结点变成x的根结点}}}

http://www.dtcms.com/a/193206.html

相关文章:

  • 嵌入式培训之数据结构学习(四)双向链表、makefile
  • Java 序列化(Serialization)
  • MUSE Pi Pro 使用TiTanTools烧录镜像
  • SiFli-SDK 编译
  • 车载诊断进阶篇 --- 车载诊断概念
  • 基于互联网和LabVIEW的多通道数据采集系统仿真设计
  • Spring 模拟转账开发实战
  • Spring MVC HttpMessageConverter 的作用是什么?
  • 2025年,如何制作并部署一个完整的个人博客网站
  • 智能视觉赋能精准抓取:富唯智能重新定义机械臂应用新高度​
  • 嵌入式学习笔记 D21:双向链表的基本操作
  • 深入浅出:Windows系统DLL劫持提权原理
  • 位运算题目:找到最接近目标值的函数值
  • 面试从微前端拓展到iframe是如何通信的
  • 计量——检验与代理变量
  • 【备忘踩坑】Android单元测试中读取测试assets的方法
  • EdgeShard:通过协作边缘计算实现高效的 LLM 推理
  • NY244NY249美光闪存颗粒NY252NY256
  • U9C与钉钉审批流对接完整过程
  • 数据结构—排序(斐波那契数列,冒泡,选择,插入,快速,归并,图,广度优先算法)
  • 【Docker】Docker安装Redis
  • Git命令总结
  • 2025年大厂C++面试题总结与解析
  • 【C++】解析C++面向对象三要素:封装、继承与多态实现机制
  • Remote Desktop安卓远程无法使用中文输入法
  • deepseek讲解如何快速解决内存泄露,内存溢出问题
  • C#数据类型
  • Python中常用的数据类型
  • 反向传播
  • 2、ubantu系统配置OpenSSH | 使用vscode或pycharm远程连接