Java数据结构之《最短路径》(难度系数100)

一、前言:

  这是怀化学院的:Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成类似的代码,重要的是理解它的算法原理!)

二、题目要求如下: 

(第 10 题) 最短路径(难度系数100)

最短路径
描述:
已知一个城市的交通路线,经常要求从某一点出发到各地方的最短路径。例如有如下交通图:

则从A出发到各点的最短路径分别为:
B:0
C:10
D:50
E:30
F:60
输入:
输入只有一个用例,第一行包括若干个字符,分别表示各顶点的名称,接下来是一个非负的整数方阵,方阵维数等于顶点数,其中0表示没有路,正整数表示两点之间边的长度。可以假定该图为有向图。
最后一行为要求的出发点。
输出:
输出从已知起点到各顶点的最短路径长度。输出格式是根据顶点输入顺序,依次输出其最智短路径长度。各顶点分别用一行输出,先输出目标顶点,然后一冒号加一个空格,最后是路径长度。0表示没有路。
样例输入:
ABCDEF
0 0 10 0 30 100
0 0 5 0 0 0
0 0 0 50 0 0
0 0 0 0 0 10
0 0 0 20 0 60
0 0 0 0 0 0
A
样例输出:
B: 0
C: 10
D: 50
E: 30
F: 60

三、代码实现: (代码的做题原理全部在代码注释中,若还有疑问也可以翻数据结构书关于快速排序的基本原理的内容) 

补充:这个题我是基于邻接矩阵实现有向图的最短路径搜索。应该当你放到考试系统里检测代码是否正确时,请把所有的代码注释去掉!不过是自己的编译器应该没问题的。

(1)为了方便我全部将操作的方法和输入输出全部放在一个类:Main类里。在书上是分开去写,这样看的清楚一点,好理解一点,用的时候只要实例化对象调用方法就行。

package com.fs.graph;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String vertex= sc.next();  //输入记录所有顶点的字符串int len=vertex.length();int[][]edges = new int[len][len];  //有向图的关系矩阵for(int i=0;i<len;i++){for(int j=0;j<len;j++){edges[i][j]=sc.nextInt();}}//这里的作用就是把所有关系矩阵中的某个值为0的数:给它赋值成(最大值一个 int可以有2的31次方 -1)意思代表它与某个顶点无边的意思(可以这样表示:无穷->无边)for(int i=0;i<len;i++){for(int j=0;j<len;j++){if(edges[i][j]==0){edges[i][j]=Integer.MAX_VALUE;}}}//输入出发顶点:那就要找到源点(也就是出发点)在字符串的位置,因为要从这个地方的下标去关系矩阵找它到其他顶点的最短路径int v=vertex.indexOf(sc.next());//标记出发点到该顶点是否已经找到了最短路径,如果是(true:表示已经找到,反之表示没有)//当前创建的时候全部默认是falseboolean[] st =new boolean[len];//用来储存出发点到各个顶点的最短路径长度(当然出发点到出发点为0)int [] distance = new int[len];for(int i=0;i<len;i++){distance[i]=edges[v][i];  //这里就是初始的时候出发点到各个顶点的最短路径长度}st[v]=true;  //给它自己到自己的最短路径已经找到,并标记true//现在开始寻找for(int i=0;i<len;i++){//设置默认路径最小值为"无穷"int min = Integer.MAX_VALUE;//默认每次寻找到的顶点的最小路径的下标int index=-1;for(int j=0;j<len;j++){//条件是要去没有找到最短路径的顶点中去寻找if(st[j]==false){//因为之前已经把所有最初的:出发点到各个顶点的暂时最段路径记下//所以依次去寻找出发点到各个顶点中:相互比较后第一个最小距离的下标if (distance[j] < min) {index = j;  //每找到一个就把索引变化min = distance[j];}}}//循环结束后:如果找到出发点到索引index顶点的最短路径长度if(index!=-1) {st[index] = true;}else{//表示全都其余顶点都与出发点的边都没关系break;}//接下来就要分析前面得到的最短路径是否是真的最短//因为有两种情况(1.出发点只能直接到这个顶点的距离,不能经过某个其他的点再到这个顶点 2.还有就是它能够通过出发点到其他点再到现在这个点)//就是比较这两个哪个路径最短for(int k=0;k<len;k++){//首先要判断这个顶点是否已经找到最短路径了if(st[k]==false){//要求已经找到最短路径的这个顶点能够通过存在的边到达某个其余顶点//而且当已经找到最短路径的这个顶点(也就是从出发点到这个顶点最短路径)+这个顶点到某个其余顶点的距离:如果小于出发点直接到达某个顶点的距离(也就是最开始设定的"最短路径",不经过其他顶点)if(((edges[index][k])!=Integer.MAX_VALUE)&&(min+edges[index][k]<distance[k])){distance[k]=min+edges[index][k];  //满足就要更新一次最短路径}}}}//最后打印出发点到各个顶点间的最短路径for(int i =0;i<len;i++){if(i==v)continue;  //出发点题目不要求输出//如果没有路径可走也就是输出0 ,因为之前全部把0变成最大值,所以现在要变回来0if(distance[i]==Integer.MAX_VALUE){distance[i]=0;}System.out.println(vertex.charAt(i)+": "+distance[i]);}}}

 四、代码测试运行结果: 

<1>题目上的测试输入样例:

<2>数据结构上的测试输入样例: 

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

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

相关文章

西工大计算机学院计算机系统基础实验一(环境配置)

首先&#xff0c;不要焦虑&#xff0c;稳住心态慢慢来&#xff0c;一点一点做&#xff0c;跟着作者把基础打好&#xff0c;比什么都重要。作者曾经经历过这份痛苦&#xff0c;知道它有多么不好受。当初的作者高中之前甚至都没有自己的一台笔记本&#xff0c;上了大学以后学C语言…

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中&#xff0c;日志记录是一个不可或缺的组成部分。为了满足不同的需求&#xff0c;Java社区涌现出多…

xilinx系列FPGA基于VIVADO的pin delay列表生成说明

目录 1 概述2 示例平台3 操作说明4 注意事项 xilinx系列FPGA基于VIVADO的pin delay列表生成说明 1 概述 本文用于讲诉xilinx系列FPGA基于VIVADO的pin delay列表生成说明&#xff0c;以及一些注意事项&#xff0c;为FPGA设计人员探明道路。 Pin delay 即FPGA内部die到pin的延时…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库&#xff0c;用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API&#xff0c;可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求&#xff0c;可以轻松地与JSON、XML等数据格式进行…

Linix服务器添加dns解析

Linix开通互联网域名地址出现&#xff0c;如下错误&#xff1a; 需要访问的服务器上添加dns解析 vim /etc/sysconfig/network-scripts/ifcfg-ens192 添加如下配置&#xff1a; DNS1202.96.134.13 重启网卡&#xff1a; systemctl restart network 注意如果是docker服务部署…

软著项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

Vue实现条件渲染

&#x1f4d1;前言 本文主要是【Vue】——Vue实现条件渲染的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

电商项目之Web实时消息推送(附源码)

文章目录 1 问题背景2 前言3 什么是消息推送4 短轮询5 长轮询5.1 demo代码 6 iframe流6.1 demo代码 7 SSE7.1 demo代码7.2 生产环境的应用 &#xff08;重要&#xff09; 8 MQTT 1 问题背景 扩宽自己的知识广度&#xff0c;研究一下web实时消息推送 2 前言 文章参考自Web 实时消…

数学建模-基于机器学习的家政行业整体素质提升因素分析

基于机器学习的家政行业整体素质提升因素分析 整体求解过程概述(摘要) 家政服务业即为家庭提供多种类服务的专门行业&#xff0c;在第三产业中占有重要地位。但近年来&#xff0c;由于人工智能家居产业的发展与客户对家政从业者的要求水平不断提高&#xff0c;家政行业仍面对较…

03、pytest初体验

官方实例 # content of test_sample.py def func(x):return x 1def test_ansewer():assert func(3) 5步骤解释 [100%]指的是所有测试用例的总体进度&#xff0c;完成后&#xff0c;pytest显示一个失败报告&#xff0c;因为func(3)没有返回5 注意&#xff1a;你可以使用ass…

Apache Doris 在某工商信息商业查询平台的湖仓一体建设实践

本文导读&#xff1a; 信息服务行业可以提供多样化、便捷、高效、安全的信息化服务&#xff0c;为个人及商业决策提供了重要支撑与参考。本文以某工商信息商业查询平台为例&#xff0c;介绍其从传统 Lambda 架构到基于 Doris Multi-Catalog 的湖仓一体架构演进历程。同时通过一…

c题目16:写一个递归函数,计算N阶乘

每日小语 一生中&#xff0c;最光辉的一天并非功成名就的那一天&#xff0c;而是从悲叹与绝望中产生对人生挑战与勇敢迈向意志的那一天。——福楼拜 自己思考 这个小语呢&#xff0c;我目前还达不到&#xff0c;只是顺其自然&#xff0c;很多东西做起来很有动力&#xff0c;…

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示&#xff0c;OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息&#xff0c;分类是科学仪器和网站服务两大类。申请日期是今年的11月2日&#xff0c;目前处于审核状态。 该申请由知识产权代理公司完成&#xff0c;但申请人的地址正是OpenAI在美国公司的地…

Android Studio 模拟器设置独立窗口

目录 模拟器在窗口内部运行 设置成独立窗口 模拟器在窗口内部运行 操作起来十分不便 设置成独立窗口 Android Studio -> Preferences(Settings) -> Tools-> Emulator ->取消勾选 Launch in a tool window -> 点击右下角的 OK 按钮 -> 重启 Android Studio

二分查找边界问题——排序数组找元素第一次出现和最后一次出现

二分查找的边界逼近问题&#xff1a; 下面的代码&#xff0c;第一个函数会向左边界逼近&#xff0c;第二个函数会像右边界逼近&#xff01; 考虑left5,right6这种情况&#xff0c;如果5&#xff0c;6的值都是满足的条件的怎么办&#xff1f; 如果mid(leftright1)/2&#xff0c;…

小白备战蓝桥杯:Java常用API

目录 一、什么是API 二、API帮助文档的使用 三、String String中的成员方法都不会修改原字符串 String是啥&#xff1f; String常见构造方法 equals&#xff1a;字符串比较&#xff08;区分大小写&#xff09;​编辑 equalsIgnoreCase&#xff1a;字符串比较&#xff0…

玄子Share-CSS3 弹性布局知识手册

玄子Share-CSS3 弹性布局知识手册 Flexbox Layout&#xff08;弹性盒布局&#xff09;是一种在 CSS 中用于设计复杂布局结构的模型。它提供了更加高效、简便的方式来对容器内的子元素进行排列、对齐和分布 主轴和交叉轴 使用弹性布局&#xff0c;最重要的一个概念就是主轴与…

从零开始训练一个ChatGPT大模型(低资源,1B3)

macrogpt-prertrain 大模型全量预训练(1b3), 多卡deepspeed/单卡adafactor 源码地址&#xff1a;https://github.com/yongzhuo/MacroGPT-Pretrain.git 踩坑 1. 数据类型fp16不太行, 很容易就Nan了, 最好是fp32, tf32, 2. 单卡如果显存不够, 可以用优化器adafactor, 3. 如果…

【Go】protobuf介绍及安装

目录 一、Protobuf介绍 1.Protobuf用来做什么 2. Protobuf的序列化与反序列化 3. Protobuf的优点和缺点 4. RPC介绍 <1>文档规范 <2>消息编码 <3>传输协议 <4>传输性能 <5>传输形式 <6>浏览器的支持度 <7>消息的可读性和…