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

Day57--图论--53. 寻宝(卡码网)

Day57–图论–53. 寻宝(卡码网)

今天学习:最小生成树。有两种算法(Prim和Kruskal)和一道例题。

prim 算法是维护节点的集合,而 Kruskal 是维护边的集合

最小生成树:所有节点的最小连通子图,即:以最小的成本(边的权值)将图中所有节点连接到一起。

53. 寻宝(卡码网)

方法:Prim最小生成树

思路:

  1. 第一步,选距离生成树最近节点
  2. 第二步,最近节点加入生成树
  3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)(minDist数组用来记录每一个节点距离最小生成树的最近距离。)
import java.util.*;public 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);}for (int i = 0; i < e; i++) {int from = in.nextInt();int to = in.nextInt();int val = in.nextInt();grid[from][to] = val;grid[to][from] = val;}int[] minDist = new int[v + 1];Arrays.fill(minDist, 10001);boolean[] isInTree = new boolean[v + 1];for (int i = 1; i < v; i++) {int cur = -1;int minVal = Integer.MAX_VALUE;for (int j = 1; j <= v; j++) {if (!isInTree[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}isInTree[cur] = true;for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}int sum = 0;for (int i = 2; i <= v; i++) {sum += minDist[i];}System.out.println(sum);}
}

方法:Kruskal最小生成树

思路:

  • 边的权值排序,因为要优先选最小的边加入到生成树里
  • 遍历排序后的边
    • 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
    • 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合
import java.util.*;class Disjoint {private int[] father;public Disjoint(int n) {father = new int[n + 1];for (int i = 0; i <= n; i++) {father[i] = i;}}public int find(int a) {if (a == father[a]) {return a;} else {return father[a] = find(father[a]);}}public boolean isSame(int o1, int o2) {return find(o1) == find(o2);}public void join(int o1, int o2) {int root1 = find(o1);int root2 = find(o2);if (root1 == root2) {return;}father[root2] = root1;}
}public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int v = in.nextInt();int e = in.nextInt();Disjoint dj = new Disjoint(v);int[][] edges = new int[e][3];for (int i = 0; i < e; i++) {edges[i][0] = in.nextInt();edges[i][1] = in.nextInt();edges[i][2] = in.nextInt();}Arrays.sort(edges, (a, b) -> Integer.compare(a[2], b[2]));int sum = 0;for (int i = 0; i < e; i++) {int n1 = edges[i][0];int n2 = edges[i][1];int val = edges[i][2];if (!dj.isSame(n1, n2)) {dj.join(n1, n2);sum += val;}}System.out.println(sum);}
}
http://www.dtcms.com/a/330558.html

相关文章:

  • Nacos-4--Nacos1.x长轮询的理解
  • PiscTrace基于YOLO追踪算法的物体速度检测系统详解
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • 【入门级-算法-2、入门算法:模拟法】
  • 解决“Win7共享文件夹其他电脑网络无法发现共享电脑名称”的问题
  • 融合服务器助力下的电视信息发布直播点播系统革新
  • 服务器装两个cpu
  • 1780. 判断一个数字是否可以表示成三的幂的和
  • MongoDB 从入门到生产:建模、索引、聚合、事务、分片与运维实战(含 Node.js/Python 示例)
  • 基于现代 C++ 的湍流直接数值模拟 (DNS) 并行算法优化与实现
  • 9.【C++进阶】继承
  • 河南萌新联赛2025第(五)场:信息工程大学”(补题)
  • QLab Pro for Mac —— 专业现场音频与多媒体控制软件
  • Boost库中Pool 基础内存池(boost::pool<>)的详细用法解析和实战应用
  • filezilla mac新版本MacOS-12.6.3会自动进入全屏模式BUG解决方法
  • 图论Day2学习心得
  • 支持pcm语音文件缓存顺序播放
  • springBoot+knife4j+openapi3依赖问题参考
  • 图灵测试:人工智能的“行为主义判据”与哲学争议
  • 计算机毕设大数据选题推荐 基于spark+Hadoop+python的贵州茅台股票数据分析系统【源码+文档+调试】
  • 浏览器环境下AES-GCM JavaScript 加解密程序
  • Vue Vant应用-数据懒加载
  • Docker + Cronicle + Traefik 搭建服务器计划任务工具
  • Vue3从入门到精通: 4.2 Vue Router路由守卫与权限控制深度解析
  • uni-app 小程序跳转小程序
  • rn入口文件setup.js解读
  • JS 解构赋值语法
  • 问题总结三
  • 最新去水印小程序系统 前端+后端全套源码 多套模版 免授权(源码下载)
  • 前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡