路径 Dijkstra 蓝桥杯 JAVA

目录

  • 题目描述:
  • Dijkstra 算法 (朴素版):
  • 用Dijkstra解决本题:

题目描述:

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。 小蓝的图由2021 个结点组成,依次编号1 至2021。
对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点之间没有边相连; 如果a 和b
的差的绝对值小于等于21,则两个点之间有一条长度为a 和b 的最小公倍数的无向边相连。 例如:结点1 和结点23 之间没有边相连;结点3
和结点24 之间有一条无向边,长度为24; 结点15 和结点25 之间有一条无向边,长度为75。 请计算,结点1 和结点2021
之间的最短路径长度是多少。

提示:建议使用计算机编程解决问题

答案:10266837


Dijkstra 算法 (朴素版):

迪杰斯特拉(dijkstra)算法是单源最短路径问题的求解方法。单源最短路径就在给出一个固定网络,指定一个原点s,一个目标点e,求这两个点之间的最短路径。

迪杰斯特拉算法是,基于贪心算法,目标是求最短路径,既然整个路径是最短得,那么分支也应该是最短的,所以按我的理解,迪杰斯特拉算法,就是在找最短子路径,然后迭代下去,这样每个子路径是最优的,那么整个路径就是最优的

需要的数组有一维数组distdist[i]记录的是i点到起点的距离,edges二维数组edges[i][j]表示点i到点j的距离。最后是visit一维数组visit[i]表示每个点是否被遍历过

如果对这个算法一点不了解的话可以看这个大哥讲的是真不错:迪杰斯特拉算法详讲。

这里直接给出dijkstra的模板代码:

import java.util.*;

public class Main {
    public static int edges[][];//存放所有边edges[i][j]代表从i ~ j 的距离
    public static int dist[];//存入起点到所有点的距离。
    public static boolean visit[];//标记当前点是否被遍历过
    public static int INF = 0x3f3f3f3f;
	public static void main(String[] args) {
		
	}
    public static int dijkstra(int n) {//传入终点
    	for(int i = 1; i <= n; i ++) {
    		int index = -1;//未被访问的点,到原点最短距离的点。
    		dist[1] = 0;//原点到原点的距离为0
    		for(int j = 1; j <= n; j ++) {//找最小点
    			if(!visit[j] &&(index == -1 || dist[j] < dist[index])) {
    				index = j;
    			}
    		}
    		visit[index] = true;//标记用过
    		for(int j = 1; j <= n; j ++) {//更新
    			if(dist[index] + edges[index][j] < dist[j]) {
    				dist[j] = dist[index] + edges[index][j];
    			}
    		}
    	}
    	if(dist[n] == INF) return - 1;
    	return dist[n];
    }
}

这里要注意的是迪杰斯特拉算法,边的权值不能为负,真是一条边为负都不行:

以下图为例:
在这里插入图片描述
代码:

import java.util.*;

public class Main {
    public static int edges[][];//存放所有边edges[i][j]代表从i ~ j 的距离
    public static int dist[];//存入起点到所有点的距离。
    public static boolean visit[];//标记当前点是否被遍历过
    public static int INF = 0x3f3f3f3f;
	public static void main(String[] args) {
		 edges = new int[5][5];
		 dist = new int[5];
		 visit = new boolean[5];
		 Arrays.fill(dist, INF);
		 
		 for(int i = 1; i <= 4; i ++)
			 for(int j = 1; j <= 4; j ++) edges[i][j] = INF;
		 
		 edges[1][1] = 0;
		 edges[2][2] = 0;
		 edges[3][3] = 0;
		 edges[4][4] = 0;
		 
		 edges[1][2] = 1; 
		 edges[1][3] = 2;
		 edges[1][4] = 8;
		 edges[2][4] = 4;
		 edges[3][4] = 5;
		 edges[3][2] = -2;
		 
		 
		 System.out.println(dijkstra(4));
		 
		// for(int i = 1; i <= 4; i ++) System.out.print(dist[i] + " ");
		 
	}
    public static int dijkstra(int n) {//传入终点
    	for(int i = 1; i <= n; i ++) {
    		int index = -1;//未被访问的点,到原点最短距离的点。
    		dist[1] = 0;//原点到原点的距离为0
    		for(int j = 1; j <= n; j ++) {//找最小点
    			if(!visit[j] &&(index == -1 || dist[j] < dist[index])) {
    				index = j;
    			}
    		}
    		visit[index] = true;
    		for(int j = 1; j <= n; j ++) {
    			if(dist[index] + edges[index][j] < dist[j]) {
    				dist[j] = dist[index] + edges[index][j];
    			}
    		}
    	}
    	if(dist[n] == INF) return - 1;
    	return dist[n];
    }
}

输出:
在这里插入图片描述

正确答案是 4,这是迪杰斯特拉算法特性导致的,最开始点2到原点距离最短,会选择点2进行更新,但不会选择点3
后续即使用点3更新了点2,由于点2已经被使用过了,所以无法再使用了。
本算法和floyd算法本质不同是floyd算法记录了任意两点的最优距离,本算法是记录任意一点到起点的最优距离。(Floyd算法可以允许路径有负权,但回路不能为负。)


用Dijkstra解决本题:

了解dijkstra后,代码就非常好写了,这里直接给出本题代码。

代码:

import java.util.Arrays;

public class text {
	 public static int edges[][];//存放所有边edges[i][j]代表从i ~ j 的距离
	 public static int dist[];//存入起点到所有点的距离。
	 public static boolean visit[];//标记当前点是否被遍历过
	 public static int INF = 0x3f3f3f3f;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  int n = 2022;
		  edges = new int[n][n];
		  dist = new int[n];
		  visit = new boolean[n];
		  for(int i = 1; i <= 2021; i ++)
			  for(int j = 1; j <= 2021; j ++) {
				  if(Math.abs(i - j) <= 21) {
					  edges[i][j] = getgb(i, j);
				  }
				  else
					  edges[i][j] = INF;
			  }
		  Arrays.fill(dist, INF);
		  System.out.print(dijkstra(2021));
	}
	public static int getgb(int x, int y) {//最小公因数
		int maxgy = 1;
		int minone = Math.min(x, y);
		for(int i = 1; i <= minone; i ++)
			if(x % i == 0 && y % i == 0)
				maxgy = i;
		return x * y / maxgy;
	}
    public static int dijkstra(int n) {
    	for(int i = 1; i <= n; i ++) {
    		int index = -1;
    	    dist[1] = 0;//初始化
    	    for(int j = 1; j <= n; j ++) {//找距离原点最近的点
    	    	if(!visit[j] && (index == -1 || dist[j] < dist[index])) {
    	    		index = j;
    	    	}
    	    } 
    	    visit[index] = true;//标记用过
    	    for(int j = 1; j <= n; j ++) {//更新
    	       if(dist[index] + edges[index][j] < dist[j]) {	
    	    	   dist[j] = dist[index] + edges[index][j];
    	       }
    	    }
    	}
    	if(dist[n] == INF) return - 1;
    	return dist[n];
    }
}

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

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

相关文章

TypeScript由浅到深(上篇)

目录 一、什么是TypeScript有什么特点&#xff1a; 二、TypeScript的编译环境&#xff1a; 三、TypeScript数据类型&#xff1a; 01_标识符的类型推导&#xff1a; 02_JS中的类型Array&#xff1a; 03_JS 中的类型Object&#xff1a; 04_函数的类型&#xff1a; 05_匿名…

C++游戏分析与破解方法介绍

1、C游戏简介 目前手机游戏直接用C开发的已经不多&#xff0c;使用C开发的多是早期的基于cocos2dx的游戏&#xff0c;因此我们这里就以cocos2d-x为例讲解C游戏的分析与破解方法。 Cocos2d-x是一个移动端游戏开发框架&#xff0c;可以使用C或者lua进行开发&#xff0c;也可以混…

SpringBoot事件的选取原理

有四个事件启动监听器&#xff1a; 事件1会被监听吗&#xff1f;答案不会 容器发布一个正在启动的事件 org.springframework.context.event.AbstractApplicationEventMulticaster#retrieveApplicationListeners 遍历我们注册的监听器&#xff0c;但这里有个判断条件&#xff…

众人围剿,GPT-5招惹了谁

目录千人呼吁暂停AI训练代表人物分析反对原因分析信息安全人身安全失业利益总结GPT-4 火爆全球&#xff0c;引发了人工智能大浪潮。过去的一个月&#xff0c;OpenAI、微软、谷歌加上百度不断释放王炸&#xff0c;所有人都相信&#xff0c;AI 的就是未来的生产力。俗话说&#x…

Android动画进阶

在Android中&#xff0c;实现动画的方式通常有两种&#xff1a;视图动画和属性动画。然而这两种方式只能实现一些较为简单动画&#xff0c;仅仅通过改变这些控件属性的方式实现一些复杂的动画效果是比较有难度的&#xff0c;那么我们该如何实现复杂的动画。这里介绍两种实现方式…

Android配置Jetpack-Compose环境

Android 配置 Jetpack Compose 环境 记录配置Jetpack Compose环境的一些坑~ 本文同步更新于博客&#xff1a; 链接 直接创建kotlin项目或创建java项目后再配置均可 根目录 build.gradle 配置kotlin环境构建脚本 buildscript {ext.kotlin_version 1.4.32dependencies {clas…

大模型时代,AI模型开源还能这么玩?模型空间内测邀请(含重磅福利)

‍人工智能学习与实训社区飞桨 AI Studio自2019年以来&#xff0c;持续吸纳众多开发者于平台内开源贡献、实训提升&#xff0c;分享项目经验、共享自研模型等。 随着 AI Studio 开发者规模的增长、开发者开发能力的提升&#xff0c;我们收到许多期待与建议&#xff0c;经过一段…

企业OA管理系统需具备哪些功能?

OA也就是办公自动化&#xff0c;是通过将计算机、通信等现代化技术运用到传统办公方式而形成的一种新型办公方式。OA办公管理系统能够更加高效优质的处理办公事务以及进行企业管理业务&#xff0c;实现对资源的高效利用&#xff0c;进而达到提高生产力&#xff0c;提升管理水平…

详解vue各种权限控制与管理的实现思路

一、 菜单权限 菜单权限&#xff1a;控制用户在系统中能够看到哪些菜单项菜单权限指的就是后台系统中的左侧的菜单栏&#xff0c;前端可以根据后端接口返回的权限数据结合element-ui菜单组件循环拼接而成即可&#xff0c;有什么权限就展示什么菜单通过vuex持久化插件(本地存储…

Linux系统【centos7】常用基础命令教程

今天我来介绍一下Linux系统的基础知识。 首先&#xff0c;我们需要了解Linux是什么。Linux是一种免费且开放源代码的操作系统&#xff0c;它被广泛用于服务器、移动设备和嵌入式系统。 接下来&#xff0c;我们需要了解基本的Linux命令。其中一些基本命令包括&#xff1a; 1.…

项目 TO 的自我修养

最近作为项目 TO 在公司内完成了一个涉及面比较广的项目&#xff0c;对于如何推动项目上线有一些经验和大家分享。希望刚毕业几年、没有参与过大型项目的同学&#xff0c;从中能学到一些方法&#xff0c;为今后担任项目主力做一些准备。所谓的 TO&#xff0c;是 Technical Owne…

java和mysql进行排序和排名

目录 一、基于java排序和排名 1、数值相同,排名相同,排名连续 2、数值相同,排名相同,排名不连续 3、数值相同,排名不相同,排名连续 二、基于mysql排序和排名 1、准备一张表 2、插入数据 3、设置临时变量,方便后续查询 4、数值相同,排名相同,排名连续 5、数值相同,排名…

天猫食品饮料数据分析:2月份茶饮料品牌销量TOP10排行榜!

近年来&#xff0c;茶饮料品类逐渐丰富&#xff0c;也在潜移默化中激发消费者的购物欲望&#xff0c;茶饮料行业的整体市场规模也不断增长。 根据鲸参谋电商数据显示&#xff0c;2023年2月份在天猫平台上&#xff0c;茶饮料相关产品的月销量将近149万件&#xff0c;环比增长约…

ADAS-GPS定位原理概述

前言 “GPS传感器在无人机、室外物流车以及诸多机器人应用中经常出现&#xff0c;它们机器人的定位、导航中发挥着重要的作用&#xff0c;而今天的L2&#xff5e;L5级别自动驾驶系统更是离不开它们&#xff0c;今天我们走进它们的世界&#xff0c;探索其背后原理以及本质。” …

MySQL之事务和锁机制

文章目录一、事务1.1 事务特征1.2 隔离级别1.3 开启事务二、锁机制2.1 读锁、写锁2.2 全局锁、表锁、行锁2.3 记录锁、间隙锁、临键锁提示&#xff1a;以下是本篇文章正文内容&#xff0c;MySQL 系列学习将会持续更新 一、事务 在数据库里面&#xff0c;我们希望有些操作能够以…

leaflet实现波动的marker效果(131)

第131个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示波动的marker效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共76行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…

chatgpt 变现思路

教学 为用户提供ChatGPT的培训课程&#xff0c;教授如何使用和掌握ChatGPT的基本功能和高级技巧。课程可以通过在线平台或实体培训形式进行。 各种设计 ChatGPT可以为设计师提供创意灵感&#xff0c;包括平面设计、UI/UX设计、建筑设计等。此外&#xff0c;它还可以协助设计…

MySQL主从复制之多主多从部署流程—2023.04

文章目录一、多主多从实现架构图二、准备工作三、MySQL多主多从搭建流程1、修改2个主节点配置文件2、修改2个从节点配置文件3、2个主节点相互复制4、2个从节点分别复制主节点5、测试记录&#xff1a;一、多主多从实现架构图 这里是2主2从&#xff0c;下图基本例举出来的实现的…

电脑安装Ubuntu系统(非虚拟机)步骤简述

由于我的笔记本电脑比较古老&#xff08;近10年&#xff09;&#xff0c;已经过了质保期&#xff0c;甚至续保时间都过了&#xff0c;所以本着能用则用的想法就在上面改安装Ubuntu系统。下面简单介绍下安装过程&#xff0c;自己留笔记&#xff0c;如果有碰到同样问题的能参考更…

信息收集之WAF绕过

信息收集之WAF绕过前言一、工具进行目录扫描1. 工具的下载2. 工具的使用二、Python代码进行目录扫描前言 对于web安全无WAF的信息收集&#xff0c;大家可以查看如下链接的文章&#xff1a; web安全之信息收集 对于有WAF信息收集&#xff0c;看如下所示&#xff1a;&#xff08;…