代码随想录算法训练营第六十三天 | prim算法、kruskal算法、复习

53. 寻宝 — prim算法

题目链接:https://kamacoder.com/problempage.php?pid=1053
文档讲解:https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html

思路

本题是最小生成树的模板题,最小生成树可以使用 prim算法,也可以使用 kruskal算法计算出来。
prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。prim算法核心有三步:

  • 第一步,选距离生成树最近节点
  • 第二步,最近节点加入生成树
  • 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)

其中,minDist数组用来记录每一个节点距离最小生成树的最近距离minDist数组里的数值初始化为最大数,因为本题 节点距离不会超过 10000,所以初始化最大数为 10001就可以。

代码

import java.util.*;
class Main{public static void main (String[] args) {Scanner in = new Scanner(System.in);int v = in.nextInt();int e = in.nextInt();int[][] grid = new int[v + 1][v + 1];for (int i = 0; i <= v; i++) {Arrays.fill(grid[i], 10001);}int[] minDist = new int[v + 1];Arrays.fill(minDist, 10001);boolean[] isInTree = new boolean[v + 1];for (int i = 0; i < e; i++) {int x = in.nextInt(), y = in.nextInt();grid[x][y] = in.nextInt();grid[y][x] = grid[x][y];}for (int i = 1; i < v; i++) { // 只需要加入v-1条边即可连通// 1、prim三部曲,第一步:选距离生成树最近节点int cur = -1, minVal = Integer.MAX_VALUE;for (int j = 1; j <= v; j++) { // 开始选点//  选取最小生成树节点的条件://  (1)不在最小生成树里//  (2)距离最小生成树最近的节点if (!isInTree[j] && minDist[j] < minVal) {cur = j;minVal = minDist[j];}}// 2、prim三部曲,第二步:最近节点(cur)加入生成树isInTree[cur] = true;// 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组)for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}int res = 0;for (int i = 2; i <= v; i++) { // 不计第一个顶点,因为统计的是边的权值,v个节点有 v-1条边res += minDist[i];}System.out.println(res);}
}

53. 寻宝 — kruskal算法

题目链接:https://kamacoder.com/problempage.php?pid=1053
文档讲解:https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-Kruskal.html

思路

prim 算法是维护节点的集合,而 kruskal 是维护边的集合。
kruscal的思路:

  • 边的权值排序,因为要优先选最小的边加入到生成树里
  • 遍历排序后的边
    • 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
    • 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合

判断首尾两个节点是否在同一个集合,需要用到并查集

代码

import java.util.*;
import java.util.stream.Collectors;
class Main{static int[] father;static int v, e;static class Edge{int left, right, val;public int getVal(){ return val; }Edge(int left, int right, int val) {this.left = left;this.right = right;this.val = val;}}public static void main (String[] args) {Scanner in = new Scanner(System.in);v = in.nextInt();e = in.nextInt();father = new int[v + 1];List<Edge> edgeList = new ArrayList<>();for (int i = 0; i < e; i++) {int m = in.nextInt();int n = in.nextInt();int dist = in.nextInt();edgeList.add(new Edge(m, n, dist));}// 按边的权值对边进行从小到大排序edgeList = edgeList.stream().sorted(Comparator.comparing(Edge::getVal)).collect(Collectors.toList());init();int res = 0;for (Edge edge : edgeList) {if (!isSame(edge.left, edge.right)) { // 如果不在一个集合中,则加入res += edge.val;join(edge.left, edge.right);}}System.out.println(res);}public static void init() {for (int i = 1; i <= v; i++) father[i] = i;}public static int find(int u) {return u == father[u] ? u : (father[u] = find(father[u]));}public static boolean isSame(int u, int v) {return find(u) == find(v);}public static void join(int u, int v) {u = find(u);v = find(v);if (u == v) return;father[v] = u;}
}

复习二叉树部分

513.找树左下角的值
112.路径总和
113.路径总和ii
106.从中序与后序遍历序列构造二叉树
105.从前序与中序遍历序列构造二叉树

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

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

相关文章

bash shell 重定向输入和输出

shell 提供的重定向操作符 操作符作用>将命令的输出发到一个文件中如果文件存在&#xff0c;则新的文件数据会覆盖已经存在的文件>>将命令的输出追加到一有文件如果文件不存在&#xff0c;则创建新的文件<将文件内容重定向到命令<<内联输入重定向(inline in…

Xubuntu24.04之设置高性能模式两种方式(二百六十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

苍穹外卖--新增员工

代码开发 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各个版本维护时间

Springboot各个版本维护时间

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…

【Linux】shell基础知识点(updating)

1.输出重定向2.多命令批量执行&#xff08;; 、&&、 ||&#xff09;3.脚本不同方式执行的区别&#xff08;source、bash、sh、./&#xff09;4.理解环境变量5.export6.引号的使用last.命令相关 1.输出重定向 3种数据流&#xff1a; stdin&#xff1a;标准输入&#xf…

jmeter持续学习之----性能初级一些概念和指标

服务端为什么要进行性能测试 大量用户下&#xff0c;系统能否稳定运行&#xff08;比较多&#xff09; 用于硬件服务器的选型 用于软件技术的选型 性能测试关注的点 用户角度:响应时间 资源占用:并发用户数,TPS,资源占用(cpu,内存,JVM) 性能测试策略 基准测试:单用户测试,对…

去了字节跳动,才知道年薪40W的测试有这么多?

最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的测试都这么有钱了吗&#xff1f; 前几天还有朋友说&#xff0c;从腾讯跳槽去了字节&…

8.8.8.8 IP地址的作用

在跟着韦东山老师的学习手册中看见了关于8.8.8.8 IP用于检测网络状态&#xff0c;然后搜索了关于此IP的相关作用如下&#xff1a; 公共DNS服务&#xff1a;8.8.8.8是Google提供的两个公共DNS服务器地址之一&#xff08;另一个是8.8.4.4&#xff09;。DNS&#xff08;域名系统&a…

代码随想录训练营第三十天 452用最少数量的箭引爆气球 435无重叠区间 763划分字母区间

第一题&#xff1a; 原题链接&#xff1a;452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;先根据每个元素的第一个值进行排序&#xff0c;然后从第一个元素开始遍历&#xff0c;这里要注意我们初始化结果值的时候直接初始化为1&#x…

强化基石,引领未来:完善配套设施与提升服务水平

完善配套设施与提升服务水平对于产业园运营具有重要意义。它们不仅能够提升园区的硬件环境和整体形象&#xff0c;增强园区的吸引力和竞争力&#xff1b;还能够优化营商环境&#xff0c;降低企业运营成本&#xff0c;提高运营效率&#xff1b;同时推动园区创新&#xff0c;形成…

基于Java技术的网吧管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…

PDF转Markdown的开源工具解析

Marker&#xff1a;PDF转Markdown的开源工具解析 Marker是一个由VikParuchuri在GitHub上开发的开源项目&#xff0c;其核心功能是将PDF文件转换为Markdown格式。以下是对Marker项目的详细解析&#xff1a; 项目概述&#xff1a; 项目链接&#xff1a;https://github.com/VikP…

【技术追踪】DiffuMatting:使用抠图级别注释合成任意对象(ECCV-2024)

万物生&#xff1a;Diffusion与绿幕抠图&#xff0c;影视领域的福音~ 论文&#xff1a;DiffuMatting: Synthesizing Arbitrary Objects with Matting-level Annotation 代码&#xff1a;https://github.com/HUuxiaobin/DiffuMatting &#xff08;即将开源&#xff09; 0、摘要 …

2024年06月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《C等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里。订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 在C中&#xff0c;下列不可做变量的是( )。 A. five-Star B. five_star C…

(补充):java各种进制和文本、图像、音频在计算机中的存储方式

文章目录 前言一、进制1 逢几进一2 常见进制在java中的表示3 进制中的转换(1)任意进制转十进制(2)十进制转其他进制二、计算机中的存储1 计算机的存储规则(文本数据)(1)ASCII码表(2)编码规则的发展演化2 计算机的存储规则(图片数据)(1)分辨率、像素(2)黑白图与灰度…

Knife4j的介绍与使用

目录 一、简单介绍1.1 简介1.2 主要特点和功能&#xff1a; 二、使用步骤&#xff1a;2.1 添加依赖&#xff1a;2.2 yml数据源配置2.3 创建knife4j配置类2.4 注解的作用 最后 一、简单介绍 1.1 简介 Knife4j 是一款基于Swagger的开源文档管理工具&#xff0c;主要用于生成和管…

Java客户端调用SOAP方式的WebService服务实现方式分析

简介 在多系统交互中&#xff0c;有时候需要以Java作为客户端来调用SOAP方式的WebService服务&#xff0c;本文通过分析不同的调用方式&#xff0c;以Demo的形式&#xff0c;帮助读者在生产实践中选择合适的调用方式。 本文JDK环境为JDK17。 结论 推荐使用Axis2或者Jaxws&#…

拆分pdf文件最简单的方法,pdf怎么拆成一页一张

在数字化的时代&#xff0c;pdf文件已经成为我们日常办公、学习不可或缺的文档格式。然而&#xff0c;有时候我们可能需要对一个大的pdf文件进行拆分&#xff0c;以方便管理和分享。那么&#xff0c;如何将一个pdf文件拆分成多个pdf呢&#xff1f;本文将为你推荐一种好用的拆分…

PLSQL Day4

--使用显式游标更新行&#xff0c;对所有salesman增加500奖金&#xff1a; declare cursor s_cursor is select * from emp where job SALESMAN for update; begin for e_s in s_cursor loop update emp set comm nvl(comm,0)500 where current of s_cur…