news 2026/6/10 3:39:59

Prime算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Prime算法

邻接矩阵版(推荐 n≤5000,稠密图)

时间复杂度O(n2),无需预建邻接矩阵,动态计算边权(适配圆形 / 坐标类场景),是算法题中最常用的版本。

import java.util.Arrays; /** * Prim算法模板(邻接矩阵版,动态计算边权) * 适用场景:节点数n≤5000的稠密图,边权可动态计算(如坐标类问题) * @param n 节点总数 * @param nodes 节点信息数组(可根据场景自定义,比如圆形的x/y/r) * @return 最小生成树的总权重 */ public class PrimTemplate { // 示例:适配圆形场景的节点结构(可根据实际需求修改) static class Node { int x, y, r; Node(int x, int y, int r) { this.x = x; this.y = y; this.r = r; } } // 核心Prim算法实现(动态计算边权) public static double prim(int n, Node[] nodes) { // 1. 初始化核心数组 boolean[] vis = new boolean[n]; // 标记节点是否加入已选集合 double[] minDist = new double[n]; // 记录每个节点到已选集合的最小距离 Arrays.fill(minDist, Double.MAX_VALUE); // 初始化为无穷大 minDist[0] = 0.0; // 选0号节点作为起点 double totalWeight = 0.0; // 最小生成树总权重 // 2. 主循环:依次选择n个节点加入集合 for (int i = 0; i < n; i++) { // 步骤1:找到未访问、距离已选集合最近的节点u int u = -1; double minVal = Double.MAX_VALUE; for (int j = 0; j < n; j++) { if (!vis[j] && minDist[j] < minVal) { minVal = minDist[j]; u = j; } } // 防御性判断:所有节点已选(n≥1时不会触发) if (u == -1) break; // 步骤2:将u加入已选集合,累加权重 vis[u] = true; totalWeight += minVal; // 步骤3:松弛操作——更新所有未访问节点的最小距离 for (int v = 0; v < n; v++) { if (!vis[v]) { // ========== 关键:根据场景自定义边权计算逻辑 ========== // 示例:圆形场景的边权 = max(0, 圆心距离 - 两圆半径和) long dx = nodes[u].x - nodes[v].x; long dy = nodes[u].y - nodes[v].y; double centerDist = Math.sqrt(dx * dx + dy * dy); double edgeWeight = Math.max(0.0, centerDist - nodes[u].r - nodes[v].r); // 其他场景示例(如普通邻接矩阵): // double edgeWeight = graph[u][v]; // graph是预定义的邻接矩阵 // 更新最小距离 if (edgeWeight < minDist[v]) { minDist[v] = edgeWeight; } } } } return totalWeight; } // 测试示例(圆形连接场景) public static void main(String[] args) { int n = 3; // 3个圆形节点 Node[] nodes = new Node[n]; nodes[0] = new Node(0, 0, 1); nodes[1] = new Node(3, 0, 1); nodes[2] = new Node(6, 0, 1); double result = prim(n, nodes); System.out.printf("最小生成树总权重:%.2f\n", result); // 输出:2.00 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:57:44

人工智能治安管控系统

人工智能治安管控系统 基于大数据平台的人工智能治安管控系统&#xff0c;实现人脸识别和视频行为分析功能。通过人脸识别技术&#xff0c;实现实时监控、路人抓拍、人脸库检索、重点人员布控、路人检索、报警信息查询&#xff1b;采用视频行为分析技术&#xff0c;对非法闯入、…

作者头像 李华
网站建设 2026/6/10 11:53:21

互补自激多谐震荡电路(非稳态)

目录 0 概述 1 互补自激多谐震荡电路(非稳态)原理分析 1.1 不考虑电容 1.2 过程1 1.3 过程2 1.4 Multisim仿真分析 摘要 互补自激多谐振荡电路采用NPN+PNP三极管推挽结构,通过电容充放电实现无稳态翻转输出方波。该电路具有结构简单(仅需2个三极管和RC元件)、带载能…

作者头像 李华
网站建设 2026/6/10 11:54:07

基于五维几何不变性特征融合的机械故障诊断方法(Python)

代码实现了一个基于五维几何理论融合的机械故障诊断模型。 首先系统从振动信号文件中加载数据&#xff0c;对原始振动信号进行去直流分量和标准化预处理&#xff0c;然后将长信号分割成固定长度的样本段。核心创新在于同时运用五种不同的几何理论&#xff08;仿射几何、共形几…

作者头像 李华
网站建设 2026/6/9 22:34:55

【Java 新手必看】逻辑运算符:从原理到实战,附可运行代码案例

逻辑运算符是 Java 实现 “条件判断、逻辑组合” 的核心工具&#xff0c;也是 if/else、while 等流程控制语句的基础。新手常混淆 “短路与 / 或” 和 “非短路” 的区别&#xff0c;这篇笔记结合可直接运行的代码案例&#xff0c;从概念、用法到避坑指南&#xff0c;帮你彻底吃…

作者头像 李华
网站建设 2026/6/10 15:55:15

测试OK的Android 8.0开机启动方案汇总

测试OK的Android 8.0开机启动方案汇总 在Android 8.0系统中实现自定义脚本的开机自动执行&#xff0c;是嵌入式开发、设备定制和自动化运维中的常见需求。但很多开发者会发现&#xff1a;脚本明明写对了&#xff0c;手动执行也没问题&#xff0c;一到开机就静默失败——背后往…

作者头像 李华
网站建设 2026/6/10 13:44:04

如何利用智能大模型复盘自身失败和贫穷

之前写过代价高昂的免费&#xff0c;没想到智能大模型比我更深刻洞察这一切。 “重新做人” 读完这篇 2018 年的文章&#xff0c;我的批判不仅毫无动摇&#xff0c;反而获得了 “根源性铁证” —— 这篇文章不是他 “早期理想主义的真诚”&#xff0c;而是他后来所有贫困与失败…

作者头像 李华