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:表示已经找到,反之表示没有)
        //当前创建的时候全部默认是false
        boolean[] 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变成最大值,所以现在要变回来0
            if(distance[i]==Integer.MAX_VALUE){
                distance[i]=0;
            }
            System.out.println(vertex.charAt(i)+": "+distance[i]);
        }
    }

}

 四、代码测试运行结果: 

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Chips(标签)

目录 一、流式布局标签发展历程 二、类型及使用 2.1 Chip.Action(默认值) 2.2 Chip.Entry 2.3 Chip.Filter 2.4 Chip.Choice 三、常用事件 3.1 OnClickListener 3.2 OnCheckedChangeListener 3.3 OnCloseIconClickListener 四、ChipGroup 4.1 ChipGroup Chip.Choi…

计算机组成学习-中央处理器总结

复习本章时&#xff0c;思考以下问题&#xff1a; 1)CPU分为哪几部分&#xff1f;分别实现什么功能&#xff1f; 2)指令和数据均存放在内存中&#xff0c;计算机如何从时间和空间上区分它们是指令还是数据&#xff1f; 3)什么是指令周期、机器周期和时钟周期&#xff1f;它们之…

java小工具util系列3:JSON转实体类对象工具

文章目录 准备工作1.JSONObject获取所有的key2.集合中实体对象转换 list中Enrey转Dto3.字符串转List<BusyTimeIndicatorAlarmThreshold>4.json字符串转JSONObject5.list根据ids数组过滤list6.json字符串转JavaBean对象7.json对象转javabean8.jsonObject转map9.List\<U…

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…

IDEA插件配置--maven篇

仓库地址 IDEA中maven插件仓库默认地址&#xff1a;C:\Users\Administrator.m2\repository 在D盘新建一个文件夹用做本地仓库地址&#xff0c;例如 D:\Program Files\maven\repository&#xff0c;将原先C盘路径下的repository拷贝到D盘 修改settings.xml配置文件 镜像地…

基于微服务架构的外卖系统源码开发

在当前互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;用户对于高效、智能的外卖服务需求不断增加。为了满足这一需求&#xff0c;采用微服务架构的外卖系统成为了开发的主流方向。本文将探讨基于微服务的外卖系统源码开发&#xff0c;涉及到关键技术和示例代码。 1. 微…

SpringBoot3-快速体验

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

搞笑视频无水印下载,高清无水印视频网站!

搞笑视频无水印下载这件事情一直困扰了广大网友&#xff0c;每当看见好玩好笑的搞笑视频然而下载下来的时候&#xff0c;要么画质模糊就带有水印今天分享大家几个搞笑视频无水印下载方法。 这是一个非常良心的搞笑视频无水印下载小程序水印云&#xff0c;它支持图片去水印、视…

Flutter桌面应用程序定义系统托盘Tray

文章目录 概念实现方案1. tray_manager依赖库支持平台实现步骤 2. system_tray依赖库支持平台实现步骤 3. 两种方案对比4. 注意事项5. 话题拓展 概念 系统托盘&#xff1a;系统托盘是一种用户界面元素&#xff0c;通常出现在操作系统的任务栏或桌面顶部。它是一个水平的狭长区…

vscode git管理

vscode添加了git管理 1、如下按钮&#xff0c;可以看到本次的修改部分 2、安装git history 就可以查看每次的不同部分了

阿里云环境下的配置DNS和SLB的几种实践示例

一、背景 对于大多中小型公司来说&#xff0c;生产环境大多是购买阿里云或者腾讯云等等&#xff0c;也就存在以下需求&#xff1a; 外网域名内网域名SLB容器化部署 特别是前两项&#xff0c;一定是跳不过的。容器化部署&#xff0c;现在非K8S莫属了。 既然是购买阿里云&…

Codeforces Round 913 (Div. 3)(A~G)

1、编程模拟 2、栈模拟 3、找规律&#xff1f;&#xff08;从终止状态思考&#xff09; 4、二分 5、找规律&#xff0c;数学题 6、贪心&#xff08;思维题&#xff09; 7、基环树 A - Rook 题意&#xff1a; 直接模拟 // Problem: A. Rook // Contest: Codeforces - C…

JSON 语法详解:轻松掌握数据结构(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

人、机不同在于变与多

人擅长变&#xff0c;如变模态、变尺度&#xff0c;而机器侧重多&#xff0c;如多模态、多尺度。 人类擅长变化的能力是由于我们的大脑和思维能力的灵活性所决定的。我们可以通过学习和适应&#xff0c;改变我们的态度、行为方式和观点&#xff0c;以适应不同的情境和环境。例如…

python基于轻量级卷积神经网络模型ShuffleNetv2开发构建辣椒病虫害图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

dockerdesktop 制作asp.net core webapi镜像-连接sqlserver数据库容器

1.使用visual studio 创建 asp.net core webapi项目 选择启用docker 会生成Dockerfile文件 2.使用efcore连接数据库&#xff0c;安装efcore的包 <ItemGroup><PackageReference Include"Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version&qu…

MySQL 对null 值的特殊处理

需求 需要将不再有效范围内的所有数据都删除&#xff0c;所以用not in (有效list)去实现&#xff0c;但是发现库里&#xff0c;这一列为null的值并没有删除&#xff0c;突然想到是不是跟 anull 不能生效一样&#xff0c;not in 对null不生效&#xff0c;也需要特殊处理。 解决 …

西安安泰Aigtek——ATA-8152射频功率放大器

ATA-8152射频功率放大器简介 ATA-8152是一款射频功率放大器。其P1dB输出功率100W&#xff0c;饱和输出功率200W。增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可与主流的信号发生器配套使用&#xff0c;实现射频信号的放大。宽范围供…

数据结构 | 查漏补缺之

DFS&BFS 哈希表-二次探测再散列法 完全二叉树&深度计算 排序 快速排序-挖坑法 插入、选择、冒泡、区别 插入从第一个元素开始&#xff0c;后面的元素与前面以及排序好的元素比较&#xff0c;插入其中&#xff0c;使其有序&#xff0c;最终效果是前面的有序选择选择…