当前位置: 首页 > news >正文

最短路径问题——Dijkstra算法+Bellmanford算法+Floyd算法

最短路径算法

  • 1、Dijkstra算法
    • 1.2 使用优先队列 优化 查找每轮中距离起点最近的节点下标`(推荐)`
  • 2、BellmanFord算法
    • 2.1 邻接表List\<Edge\>实现图的方式(稍微比邻接矩阵快一点)
    • 2.2 邻接矩阵实现图的方式(优点像Floyd算法)`不推荐`
  • 3、Floyd-Warshall算法

1、Dijkstra算法

原理:
1)每一次循环确定一个距离起点最短的节点的路径长度;
2)确定节点后,以它为中间点去更新与其相连的节点距离起点的路径长度;

准备:
1)路径图,int[][] graph;
2)节点是否使用过,boolean[] used;
3)节点距离起点的最短路径长度,int[] shortLen;

在这里插入图片描述

核心:两个判断条件
1)当前循环的最近节点判断: 1、未使用过;2、与起点间存在路径;3、小于其他节点到起点距离;
2)更新当前轮相邻节点距起点的最短路径长度判断: 1、未使用过;2、与index节点相连;3、更新后的距离小于之前达到起点的距离 或 还没有到达起点的路径;

public static void main(String[] args) {
   
		//路径图
        int[][] len = new int[2022][2022];

		 boolean[] used = new boolean[2022];        

        //起点到达每个节点的最短路径长度
        int[] shortLen = new int[2022];
        for(int i=1;i<2022;i++){
   
            shortLen[i] = len[1][i];
        }
        
        used[1] = true;

		//n个节点,要去寻找其他n-1个节点距离起点的最短路径长度,所以要遍历n-1次!!
        for(int i=2;i<2022;i++){
   
            //记录当前轮的最近未使用节点下标
            int index = 0;
            //记录当前轮的距离起点的最近未使用节点的路径长度
            int min = Integer.MAX_VALUE;

            //遍历最短路径节点,寻找当前轮未使用的最短路径长度及节点下标
            for(int j=2;j<2022;j++){
   
                if(!used[j] && shortLen[j]!=0 && min>shortLen[j]){
     //条件:1、未使用过;2、与起点间存在路径;3、小于其他节点到起点距离;
                    min = shortLen[j];
                    index = j;
                }
            }

            //找到最近节点后,将其标识为已使用
            used[index] = true;

            //根据标记的最近节点,将其作为中间节点,去重新更新其他与其相连但未使用节点的shortLen
            for(int j=2;j<2022;j++){
   
                if(!used[j] && len[index][j]!=0 && (len[index][j]+min < shortLen[j] || shortLen[j]==0)){
     //条件:1、未使用过;2、与index节点相连;3、更新后的距离小于之前达到起点的距离 或 还没有到达起点的路径;
                    shortLen[j] = len[index][j] + min;
                }
            }
        }

        System.out.println(shortLen[2021]);
    }

注意:如果将不相连的节点路径设置为Integer.MAX_VALUE,则可以优化掉两个核心判断条件中的shortLen[j]!=0 和 shortLen[j]==0条件,

不足: 路径中不能包含负权重

1.2 使用优先队列 优化 查找每轮中距离起点最近的节点下标(推荐)

public static void dijkstra(int[][] graph, int start) {
   
        int n = graph.length; // 节点数量
        int[] dist = new int[n]; // 存储从起点到各节点的最短距离
        boolean[] visited = new boolean[n]; // 标记节点是否已被处理

        // 初始化距离数组
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[start] = 0; // 起点到自身的距离为 0

相关文章:

  • 机器学习数学基础:40.结构方程模型(SEM)中卡方值与卡方自由度比
  • 2025-03-04 学习记录--C/C++-PTA 习题5-3 使用函数计算两点间的距离
  • 20250305随笔 HTML2Canvas 详解与使用指南
  • STM32单片机芯片与内部114 DSP-变换运算 实数 复数 FFT IFFT 不限制点数
  • linux进程通信之共享内存实例
  • 【Javascript网页设计】在线图片画板案例
  • BambuStudio学习笔记:FaceDetector类
  • 模块13.异常_Object
  • 服务器CPU微架构
  • LeetCode 解题思路 10(Hot 100)
  • XTDrone+Mavros+Gazebo仿真——配置与控制不同的无人机
  • DeepSeek赋能智慧工厂:推动制造业高效智能可持续,开启制造业转型升级
  • hi3516cv610适配AIC8800D80的连接路由器记录
  • 文件上传和下载前后端交互逻辑
  • leetcode1 两数之和 哈希表
  • 极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【四】
  • Golang的多团队协作开发
  • 设计模式|策略模式 Strategy Pattern 详解
  • BambuStudio学习笔记:FlushVolCalculator类
  • doris: Oracle
  • 江西省司法厅厅长张强已任江西省委政法委分管日常工作副书记
  • 《致1999年的自己》:千禧之年的你在哪里?
  • 5.19中国旅游日,上海56家景区景点限时门票半价
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复
  • 傅利叶提出下个十年战略,CEO顾捷:机器人要有温度,要用实际价值来定义形态
  • 阚吉林任重庆市民政局党组书记,原任市委组织部主持日常工作的副部长