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

news2025/1/15 19:44:09

一、前言:

  这是怀化学院的: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>数据结构上的测试输入样例: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「X」Embedding in NLP|Token 和 N-Gram、Bag-of-Words 模型释义

ChatGPT&#xff08;GPT-3.5&#xff09;和其他大型语言模型&#xff08;Pi、Claude、Bard 等&#xff09;凭何火爆全球&#xff1f;这些语言模型的运作原理是什么&#xff1f;为什么它们在所训练的任务上表现如此出色&#xff1f; 虽然没有人可以给出完整的答案&#xff0c;但…

Cannot find module ‘node:url‘报错处理

在运行vite搭建的项目时&#xff0c;遇到Cannot find module node:url’报错。具体错误如图所示&#xff1a; 造成以上问题的原因是node版本较低。Vite 需要 Node.js 版本 14.18&#xff0c;16。 解决方案&#xff1a; 上面是通过nvm切换高版本node。 再次执行运行命令&…

RPG项目01_层级设置

基于“RPG项目01_UI面板Game”&#xff0c; 找到狼人 添加组件&#xff0c;让狼人一定区域自动跟随主角进行攻击 解释&#xff1a;【烘培蓝色】因为如果什么都不做就会被烘培成蓝色对应的功能就是 可修改区域功能 当将区域设置成不可行走状态&#xff0c;则不为蓝色 烘培&…

如何选择一款安全可靠的跨网安全数据交换系统?

随着网络和数据安全的重视程度增加&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;普遍会采用内外网隔离的策略。像国内的政府机构、金融、能源电力、航空航天、医院等关乎国计民生的行业和领域均已进行了网络的隔离&#xff0c;将内部划分成不同的网段&#xff0c;…

nodejs+vue+ElementUi酒店餐饮客房点餐管理系统

系统非功能需求&#xff0c;只能是为了满足客户需求之外的非功能性要求。系统需要具有数据完整性验证的功能&#xff0c;对界面上非法的数据和不完整的数据进行提示&#xff0c;不能直接保存到数据库中&#xff0c;造成不完整性因素。运行软件:vscode 前端nodejsvueElementUi 语…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

linux 内核同步互斥技术之信号量

信号量 信号量允许多个进程同时进入临界区&#xff0c;大多数情况下只允许一个进程进入临界区&#xff0c;把信号量的计数值设置为 1&#xff0c;即二值信号量&#xff0c;这种信号量称为互斥信号量。可允许多个锁持有者。 和自旋锁相比&#xff0c;信号量适合保护比较长的临界…

PostgreSql HOT 技术

摘自唐成的《PostgreSQL修炼之道&#xff1a;从小工到专家&#xff08;第2版&#xff09;》。 一、概述 因为多版本的原因&#xff0c;当 PostgreSQL 中更新一行时&#xff0c;实际上原数据行并不会被删除&#xff0c;只是插入了一个新行。如果表上有索引&#xff0c;而更新的…

身份统一管理创新与优化 ——华为云OneAccess应用身份管理服务的2023年

2023年&#xff0c;随着云计算、物联网、人工智能等技术的快速发展&#xff0c;企业面临着数字化转型的巨大挑战与机遇。身份统一管理是企业数字化转型的基础&#xff0c;也是业务发展的关键。如何高效、安全、灵活地实现身份统一管理&#xff0c;成为企业亟待解决的首要课题。…

uniapp多行文本展开或收起(兼容h5、微信小程序,其它未测试)

文章目录 一、效果图展示1、收起2、展开3、文本过短时隐藏按钮【查看更多、收起】 二、代码实现原理&#xff1a;判断文本是否过短1、html2、css3、 js&#xff08;1&#xff09;data数据定义&#xff08;2&#xff09;获取文本高度&#xff08;3&#xff09; 获取行数&#xf…

典型的ETL使用场景

典型的ETL使用场景 ETL( Extract&#xff0c;Transform&#xff0c;Load)是一种用于数据集成和数据转换的常用技术。它主要用于从多个数据源中提取数据&#xff0c;对数据进行清洗、转换和整合&#xff0c;最后加载到目标系统中。ETL 的使用场景非常广泛&#xff0c;下面将介绍…

StringBuffer类和StringBuilder类的相关知识点

首先这俩个类都是可变序列&#xff0c;与String类不同String类是不可变序列&#xff0c;StringBuffer和StringBuilder 他们是将数据存储在char value[] 待会会给大家看一下源码&#xff0c;这俩个类相当于是String类的升级版&#xff0c;它可以让我们对字符串的操作更加的便捷…

探秘 Sass 之路:掌握强大的 CSS 预处理器(上)

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

【开源】基于Vue.js的实验室耗材管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 081 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S081。} 文末获取源码&#xff0c;项目编号&#xff1a;S081。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗…

shiny的图片如何插入,为什么会裂开?

因为你没有把资源放在内部&#xff1a; Shiny学习(二) ||构建用户界面 - 简书d 当然也有例外比如&#xff1a; shiny-如何在 Shinydashboard R 中 dashboard 标题的中心显示图像&#xff1f; - 糯米PHP

羊大师提问鲜羊奶冷冻还好喝吗?

羊大师提问鲜羊奶冷冻还好喝吗&#xff1f; 在当今追求健康、养生的时代背景下&#xff0c;各种新奇的饮食趋势层出不穷。鲜羊奶冷冻成为了备受追捧的美食新潮流。不仅具备饮食的功能&#xff0c;更是一种享受。本文小编羊大师将从鲜羊奶冷冻的制作工艺、营养价值和市场前景等…

Doris 集成 ElasticSearch

Doris-On-ES将Doris的分布式查询规划能力和ES(Elasticsearch)的全文检索能力相结合,提供更完善的OLAP分析场景解决方案: (1)ES中的多index分布式Join查询 (2)Doris和ES中的表联合查询,更复杂的全文检索过滤 1 原理 (1)创建ES外表后,FE会请求建表指定的主机,获取所有…

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

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

打CTF比赛/HVV挖洞需要了解哪些知识?

参加CTF&#xff08;Capture The Flag&#xff09;比赛或参与漏洞赏金猎人&#xff08;HVV, HackerOne Vulnerability Hunter&#xff09;活动需要以下关键知识&#xff1a; 1. 网络和系统安全&#xff1a; 理解TCP/IP、DNS、HTTP等网络协议。 掌握操作系统安全&#x…

网上售房管理系统

摘 要 网上售房管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。 从而完成完善全面的房屋买卖管理功能&#xff0c;使网上售房管…