【算法】普里姆算法解决修路问题
应用场景——修路问题
1.某地有 7 个村庄(A,B,C,D,E,F,G),现在需要修路把 7 个村庄连通
2.各个村庄的距离用边线表示(权),比如 A - B 距离 5 公里
3.问:如何修路保证各个村庄都能连通,并且修建公路的总里程最少?

思路
尽可能选择少的路线,并且每条路线最小,保证里程数最少
最小生成树问题
修路问题的本质就是最小生成树问题,先介绍一下最小生成树(MST)
1.给定一个带权的无向连通图,如何选取一颗生成树,使树上所有边上权的总和为最小,这叫最小生成树
2.N 个顶点,一定有 N-1 条边
3.包含全部顶点
4.N-1 条边都在图中

普里姆算法介绍
一、普里姆算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有 n-1 条边包含所有 n 个顶点的连通子图,也就是所谓的极小连通子图
二、普里姆的算法如下
- 设 G=(V,E) 是连通网,T=(U,D) 是最小生成树,V,U 是顶点集合,E,D是边的集合
- 若从顶点 u 开始构造最小生成树,则从集合 V 中取出顶点 u 放入到集合 U 中,标记顶点 v 的 visited[u]=1
- 若集合 U 中顶点 ui 与集合 V - U 中的顶点 vj 之间存在边,则寻找这些边中权值最小的边,但不能构成回路,将顶点 vj 加入集合 U 中,将边(ui,vj) 加入集合 D 中,标记 visited[vj]=1
- 重复步骤2,直到 U 与 V 相等,即所有顶点都被标记为访问过,此时 D 中有 n-1 条边
普里姆算法的分析
1.从 <A> 顶点开始处理 => <A,G> => 权值 2
2.从 <A,G> 开始,将 A 和 G 顶点和他们相邻的还没有访问的顶点进行处理 => <A,G,B>
3.从 <A,G,B> 开始,将 A,G,B 顶点和他们相邻的还没有访问的顶点进行处理 => <A,G,B,E>
......
6.从 <A,G,B,E,F,D> 开始,将 A,G,B,E,F,D 顶点和他们相邻的还没有访问的顶点进行处理 => <A,G,B,E,F,D,C>
public class PrimAlgorithm {public static void main(String[] args) {//测试图是否创建成功char[] data = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};int verxs = data.length;//邻接矩阵的关系使用二维数组表示,用 10000 表示两点之间不连通int[][] weight = {{10000, 5, 7, 10000, 10000, 10000, 2},{5, 10000, 10000, 9, 10000, 10000, 3},{7, 10000, 10000, 10000, 8, 10000, 10000},{10000, 9, 10000, 10000, 10000, 4, 10000},{10000, 10000, 8, 10000, 10000, 5, 4},{10000, 10000, 10000, 4, 5, 10000, 6},{2, 3, 10000, 10000, 4, 6, 10000}};//创建一个 MGraph 对象MGraph graph = new MGraph(verxs);//创建一个 MinTree 对象MinTree minTree = new MinTree();minTree.createGraph(graph, verxs, data, weight);//输出minTree.showGraph(graph);//测试普里姆算法minTree.prim(graph, 0);}
}//创建最小生成树 -> 村庄的图
class MinTree {//创建图的邻接矩阵/*** @param graph 图对象* @param verxs 图对应的顶点个数* @param data 图的各个顶点的值* @param weight 图的邻接矩阵*/public void createGraph(MGraph graph, int verxs, char[] data, int[][] weight) {for (int i = 0; i < verxs; i++) {graph.data[i] = data[i];for (int j = 0; j < verxs; j++) {graph.weight[i][j] = weight[i][j];}}}//显示图的邻接矩阵public void showGraph(MGraph graph) {for (int[] link : graph.weight) {System.out.println(Arrays.toString(link));}}//编写 prim 算法得到最小生成树/*** @param graph 图* @param v v 表示从第几个顶点开始生成*/public void prim(MGraph graph, int v) {//visited[] 标记节点是否被访问过int visited[] = new int[graph.verxs];//把当前节点标记为已访问visited[v] = 1;//h1 和 h2 记录两个顶点的下标int h1 = -1;int h2 = -1;int minWeight = 10000; //将 minWeight 初始成一个大数在后面的遍历过程中会被替换for (int k = 1; k < graph.verxs; k++) { //因为有 graph.verxs 顶点,普利姆算法结束后,有graph.verxs-1条边//确定每一次生成的子图和哪个节点最近for (int i = 0; i < graph.verxs; i++) { //i 节点表示被访问过的节点for (int j = 0; j < graph.verxs; j++) { //j 节点表示没有被访问过的节点if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minWeight) {//替换 minWeight (寻找已经访问过的节点间的权值最小的边)minWeight = graph.weight[i][j];h1 = i;h2 = j;}}}//找到一条边是最小System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + "> 权值:" + minWeight);//将当前这个节点标记为已经访问visited[h2] = 1;//minWeight 重新设置为最大值 10000minWeight = 10000;}}
}class MGraph {int verxs; //表示图的节点个数char[] data; //存放节点数据int[][] weight; //存放边,就是我们的邻接矩阵public MGraph(int verxs) {this.verxs = verxs;data = new char[verxs];weight = new int[verxs][verxs];}
}相关文章:
【算法】普里姆算法解决修路问题
应用场景——修路问题 1.某地有 7 个村庄(A,B,C,D,E,F,G),现在需要修路把 7 个村庄连通 2.各个村庄的距离用边线表示(权),比如 A - …...
Python 之Scikit-learn(二) -- Scikit-learn标准化数据
在机器学习中,数据标准化是一项关键的预处理步骤。标准化(Standardization)是将数据转换为具有均值为0和标准差为1的分布。这样可以确保特征在相同的尺度上,有助于提升某些机器学习算法的性能和稳定性。 Scikit-learn提供了一个简…...
机械学习—零基础学习日志(python编程)
零基础为了学人工智能,正在艰苦的学习 昨天给高等数学的学习按下暂停键,现在开始学习python编程。 我学习的思路是直接去阿里云的AI学习课堂里面学习。 整体感觉,阿里云的AI课堂还是有一些乱,早期课程和新出内容没有更新和归档…...
WEB应用(十三)---RCE
什么是RCE? Remote Command/Code Execute,远程命令或代码执行。通过构造特殊的字符串,将数据提交至Web应用程序,并利用该方式执行外部程序或系统命令实施攻击,类似于SQL注入。 Web应用程序使用了一些可以执行系统命令或…...
【云原生】Service服务暴露详细
Service服务 文章目录 Service服务一、Service介绍1.1、介绍1.2、Kubernetes中的Service 二、Service服务类型2.1、ClusterIP2.2、NodePort2.3、LadBalancer2.4、ExternalName 三、Service玩法3.1、定义Service3.2、端口定义别名3.3、多端口Service 四、Service类型4.1、Cluste…...
实名认证次数限制
在业务层实现实名认证次数限制 这个功能是通过以下步骤实现实名认证的次数限制: 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。成功认证后的限制࿱…...
【如何在Python中使用pathlib模块】
在Python中使用pathlib模块主要涉及创建Path对象,并利用这些对象提供的方法来执行文件系统的各种操作。以下是一些详细的步骤和示例,帮助你了解如何在Python中有效地使用pathlib模块。 1. 导入Path类 首先,从pathlib模块中导入Path类。 fr…...
sqli-labs第一关详细解答
首先判断是否有注入点 发现and 11 和 and 12结果一样,所以应该是字符型注入,需要对单引号做闭合 做闭合后发现报错,提示Limit 0,1,那就说明存在注入点,但是要注释掉后面的limit 0,1 使用--注释掉limit 0,1后ÿ…...
分布式事务一站式解决方案-Seata
分布式事务一站式解决方案- 分布式事务一站式解决方案分布式事务产生背景三个概念Seata下载和安装实际业务模拟演示不加 GlobalTransactional 注解,正常操作下单不加 GlobalTransactional 注解,下单过程出异常或者超时了加 GlobalTransactional 注解&…...
openwrt 使用ftace工具追踪协议栈转发流程
开这四个宏 CONFIG_KERNEL_DYNAMIC_FTRACEy CONFIG_KERNEL_FTRACEy CONFIG_KERNEL_FUNCTION_GRAPH_TRACERy CONFIG_KERNEL_FUNCTION_TRACERy 如果/sys/kernel/debug/tracing没有,可以挂载 mount -t debugfs nodev /sys/kernel/debug 挂载报错: mo…...
ElasticSearch优化实战:打造高性能搜索引擎的秘籍
在当今这个大数据时代,信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息,还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎,因其强大的全文搜索…...
【STL】| C++ 栈和队列(详解、容器适配器的初步引入)
目录 前言 总代码 容器适配器的引入 栈 stack 队列 queue 栈和队列用法简介 栈 队列 deque简介(了解即可) 结语 前言 今天我们要讲解的结构是栈和队列 这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容…...
xss漏洞(二,xss靶场搭建以及简单利用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …...
深度学习--------------Kaggle房价预测
目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…...
cpio 命令
前言 cpio(Copy In and Out)是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同,cpio 有其独特的优势和使用场景,特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…...
TreeMap自定义排序
我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。 1. 使用TreeMap默认的排序规则(按…...
我的CSDN 512天创作纪念日-20240807
机缘 在 2023 年 3 月 13 日,我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天,我决定将自己的实战项目经验和学习心得记录下来,与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想,促使我…...
微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域
1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库&…...
数据库中的约束,聚合函数以及联合查询
目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...
【AI大模型】Ollama+OpenWebUI+llama3本地大模型
本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 (1)目的 本教程主要关于开源A…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
