[特殊字符] 蓝桥杯 Java B 组 之最小生成树(Prim、Kruskal) 并查集应用

news2025/2/25 17:16:02

Day 3:最小生成树(Prim、Kruskal) & 并查集应用


📖 一、最小生成树(MST)简介

最小生成树(Minimum Spanning Tree, MST) 是一个 无向连通图最小代价子图,它包含 所有节点,且边的权重总和最小。

📌 最小生成树的性质

  1. 连通性:必须包含所有节点,且保证是连通的。
  2. 边数 = 节点数 - 1:MST 的边数始终是 V - 1V 是顶点数)。
  3. 权值最小:MST 的边权和最小。

📌 最小生成树的常见算法

算法核心思想时间复杂度
Kruskal贪心 + 并查集,按 边权 递增排序,逐步合并连通分量O(E log E)(边排序)
Prim贪心 + 最小堆,按 最小权重 逐步扩展 MSTO(E log V)(优先队列优化)

Kruskal 适用于稀疏图,Prim 适用于稠密图


📖 二、Kruskal 算法(贪心 + 并查集)

适用范围

  • 边稀疏的图(E 边较少)。
  • 适用于 离散集问题(如岛屿连通、网络电缆)。

🔹 1. 题目:连接所有城市的最低成本(Leetcode 1135)

题目描述: 给定 n 个城市,connections[i] = (u, v, cost) 表示 u-v 之间有条代价 cost 的边。找到最小代价的连接方案,使得所有城市连通,否则返回 -1

示例

输入: n = 3, connections = [[1,2,5],[1,3,6],[2,3,2]]
输出: 7 (选 [1,2] 和 [2,3])

🔹 2. 思路

  1. 贪心 + Kruskal 算法
    • 按边权排序(从小到大)。
    • 使用并查集(Union-Find) 逐步合并两个城市(避免形成环)。
    • n-1 条边后停止,若无法连通所有城市,则返回 -1

🔹 3. 代码实现(Kruskal)

import java.util.*;

public class KruskalMST {
    static class UnionFind {
        int[] parent, rank;
        
        public UnionFind(int n) {
            parent = new int[n + 1];
            rank = new int[n + 1];
            for (int i = 0; i <= n; i++) parent[i] = i;
        }

        public int find(int x) {
            if (x != parent[x]) parent[x] = find(parent[x]); // 路径压缩
            return parent[x];
        }

        public boolean union(int x, int y) {
            int rootX = find(x), rootY = find(y);
            if (rootX == rootY) return false; // 已经连通
            if (rank[rootX] > rank[rootY]) parent[rootY] = rootX;
            else if (rank[rootX] < rank[rootY]) parent[rootX] = rootY;
            else {
                parent[rootY] = rootX;
                rank[rootX]++;
            }
            return true;
        }
    }

    public int minCostToConnectCities(int n, int[][] connections) {
        Arrays.sort(connections, Comparator.comparingInt(a -> a[2])); // 按边权排序
        UnionFind uf = new UnionFind(n);
        int totalCost = 0, edgesUsed = 0;

        for (int[] conn : connections) {
            if (uf.union(conn[0], conn[1])) { // 连接成功
                totalCost += conn[2];
                edgesUsed++;
                if (edgesUsed == n - 1) break; // 最小生成树完成
            }
        }

        return edgesUsed == n - 1 ? totalCost : -1; // 判断是否连通
    }

    public static void main(String[] args) {
        KruskalMST solution = new KruskalMST();
        int[][] connections = {{1,2,5}, {1,3,6}, {2,3,2}};
        int n = 3;
        System.out.println(solution.minCostToConnectCities(n, connections)); // 输出 7
    }
}

🔹 4. 代码讲解

  1. 并查集(Union-Find)
    • find(x): 查找根节点(带路径压缩)。
    • union(x, y): 合并两个集合(按秩合并)。
  2. Kruskal 算法
    • 排序:按边权递增排序。
    • 遍历边:检查 u-v 是否已经连通,若未连通,则加入 MST。
    • 判断最终连通性:若选出的边数为 n-1,返回总代价,否则返回 -1

✅ 时间复杂度O(E log E)(排序 + 并查集)


📖 三、Prim 算法(贪心 + 最小堆)

适用范围

  • 边稠密的图(E 边较多)。
  • 适用于 邻接矩阵/邻接表存储

🔹 1. 代码实现(Prim)

import java.util.*;

public class PrimMST {
    public int minCostToConnectCities(int n, int[][] connections) {
        Map<Integer, List<int[]>> graph = new HashMap<>();
        for (int[] edge : connections) {
            graph.putIfAbsent(edge[0], new ArrayList<>());
            graph.putIfAbsent(edge[1], new ArrayList<>());
            graph.get(edge[0]).add(new int[]{edge[1], edge[2]});
            graph.get(edge[1]).add(new int[]{edge[0], edge[2]});
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
        pq.offer(new int[]{1, 0}); // 从城市 1 开始
        Set<Integer> visited = new HashSet<>();
        int totalCost = 0;

        while (!pq.isEmpty() && visited.size() < n) {
            int[] cur = pq.poll();
            int city = cur[0], cost = cur[1];

            if (visited.contains(city)) continue; // 已访问
            visited.add(city);
            totalCost += cost;

            for (int[] neighbor : graph.getOrDefault(city, new ArrayList<>())) {
                if (!visited.contains(neighbor[0])) {
                    pq.offer(neighbor);
                }
            }
        }

        return visited.size() == n ? totalCost : -1;
    }

    public static void main(String[] args) {
        PrimMST solution = new PrimMST();
        int[][] connections = {{1,2,5}, {1,3,6}, {2,3,2}};
        int n = 3;
        System.out.println(solution.minCostToConnectCities(n, connections)); // 输出 7
    }
}

📖 四、Kruskal vs Prim

算法核心数据结构适用场景时间复杂度
Kruskal并查集稀疏图(边少)O(E log E)
Prim最小堆(优先队列)稠密图(边多)O(E log V)

📖 五、总结

🎯 掌握 Kruskal(贪心 + 并查集),适用于离散集合最小代价连接问题
🎯 掌握 Prim(贪心 + 最小堆),适用于稠密图的最小生成树问题
🎯 最小生成树的应用

  • 网络连接(最小代价连通所有城市)
  • 电网铺设(最少电缆铺设)
  • 地图导航(最短成本的道路规划)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2305945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯】1.k倍区间

前缀和 #include <iostream> using namespace std; const int N100010; long long a[N]; int cnt[N]; int main(){int n, m;cnt[0] 1;cin >> n >> m;long long res 0;for(int i 1; i < n; i){scanf("%d", &a[i]);a[i] a[i-1];res cnt…

机器人部分专业课

华东理工 人工智能与机器人导论 Introduction of Artificial Intelligence and Robots 必修 考查 0.5 8 8 0 1 16477012 程序设计基础 The Fundamentals of Programming 必修 考试 3 64 32 32 1 47450012 算法与数据结构 Algorithm and Data Structure 必修 考试 3 56 40 …

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…

gitlab 解决双重认证无法登录remote: HTTP Basic: Access denied.

问题&#xff1a;gitlab开启了双因素认证导致无法正常使用 如进行了 OAuth configuration 在进行git操作时如下提示 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access…

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…

人工智能 阿里云算力服务器的使用

获取免费的阿里云服务器 阿里云免费使用地址&#xff1a; https://free.aliyun.com/ 选择 人工智能平台 PAI 选择交互式建模 再选建立实例。 选择对应的GPU 和镜像&#xff0c;点击确认。 注意&#xff1a;250个小时&#xff0c;用的时候开启&#xff0c;不用的时候关闭&…

硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库

文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库&#xff0c;通过将…

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…

pytorch入门级项目--基于卷积神经网络的数字识别

文章目录 前言1.数据集的介绍2.数据集的准备3.数据集的加载4.自定义网络模型4.1卷积操作4.2池化操作4.3模型搭建 5.模型训练5.1选择损失函数和优化器5.2训练 6.模型的保存7.模型的验证结语 前言 本篇博客主要针对pytorch入门级的教程&#xff0c;实现了一个基于卷积神经网络&a…

yolov12部署(保姆级教程)

yolov12部署 戳链接访问原论文论文地址 戳链接访问原代码代码地址 直接把源代码以ZIP的形式下载到本地&#xff0c;然后解压用IDE打开就可以了&#xff08;这一步比较简单不过多介绍&#xff09; 在IDE中打开可以看见一个README.md文件&#xff0c;这里有我们将yolov12部署本…

五、Three.js顶点UV坐标、纹理贴图

一部分来自1. 创建纹理贴图 | Three.js中文网 &#xff0c;一部分是自己的总结。 一、创建纹理贴图 注意&#xff1a;把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意&#xff1a;将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…

汽车零部件工厂如何通过ESD监控系统闸机提升产品质量

在汽车零部件工厂的生产过程中&#xff0c;静电带来的危害不容小觑。从精密的电子元件到复杂的机械部件&#xff0c;静电都可能成为影响产品质量的 “隐形杀手”。而 ESD 监控系统闸机的出现&#xff0c;为汽车零部件工厂解决静电问题、提升产品质量提供了关键的技术支持。 一、…

Pi币与XBIT:在去中心化交易所的崛起中重塑加密市场

在加密货币市场迅猛发展的背景下&#xff0c;Pi币和XBIT正在成为投资者关注的焦点。Pi币作为一项创新的数字货币&#xff0c;通过独特的挖矿机制和广泛的用户基础&#xff0c;迅速聚集了大量追随者&#xff0c;展示了强大的市场潜力。同时&#xff0c;币应XBIT去中心化交易所的…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…

首次使用WordPress建站的经验分享(一)

之前用过几种内容管理系统(CMS),如:dedeCMS、phpCMS、aspCMS,主要是为了前端独立建站,达到预期的效果,还是需要一定的代码基础的,至少要有HTML、Css、Jquery基础。 据说WordPress 是全球最流行的内容管理系统CMS,从现在开始记录一下使用WordPress 独立建站的步骤 选购…

Mysql 主从集群同步延迟问题怎么解决

目录 前言&#xff1a; 复制过程分为几个步骤&#xff1a; 一、同步延迟的危害 二、同步延迟的常见原因 1. 主库写入压力过大 2. 网络传输瓶颈 3. 从库硬件性能不足 4. 配置参数不合理 5. 特殊操作影响 三、深度诊断方法 1. 查看同步状态 2. 性能分析工具 四、十大解…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

三、《重学设计模式》-单例模式

单例模式 单例模式分为四大类&#xff0c;饿汉式、懒汉式、静态内部类、枚举 饿汉式 优点&#xff1a;类装载时进行实例化&#xff0c;避免同步问题 缺点&#xff1a;造成内存浪费 实现一 1.构造器私有化 2.内部创建对象实例 3.提供静态方法 public class Type1 {public s…

SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not present错误

目录 错误详情 错误原因 解决方法 引入依赖 修改配置信息 创建文件 访问 错误详情 错误原因 SpringBoot3和Swagger3版本不匹配 解决方法 使用springdoc替代springfox&#xff0c;具体步骤如下&#xff1a; 引入依赖 在pom.xml文件中添加如下依赖&#xff1a; <…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…