• Java 中应用Dijkstra算法求解最短路径


    导语:Dijkstra算法是一种解决最短路径问题的常用算法。在本文中,我们将深入探讨Dijkstra算法在Java语言中的实现原理,并给出相应的代码示例。

    介绍最短路径问题:最短路径问题是计算机科学中的经典问题之一,它可以应用于许多领域,如路由算法、航班规划和导航系统等。最短路径算法的目标是找到从给定节点到其他所有节点的最短路径。

    Dijkstra算法简介:Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra提出的,用于解决最短路径问题。它通过逐步选择距离起始节点最近的节点,并更新其邻接节点的最短距离,最终得到起始节点到其他所有节点的最短路径。

    Dijkstra算法的步骤如下:

    1. 创建一个距离数组distance[],其中distance[i]表示从起始节点到节点i的最短路径距离。将距离数组所有元素初始化为正无穷。
    2. 将起始节点的距离distance[src]设置为0。
    3. 创建一个最短路径集合shortestPathSet[],用于标记已经求得最短路径的节点。
    4. 对于每个节点,重复以下步骤:
      a. 选择未加入最短路径集合的距离最小的节点u。
      b. 将节点u加入最短路径集合shortestPathSet[]。
      c. 更新节点u的邻接节点v的最短路径距离,如果从起始节点到节点u的距离加上节点u到节点v的距离小于distance[v],则更新distance[v]的值为新的最短路径距离。
    5. 最终得到起始节点到其他所有节点的最短路径。

    现在,让我们看一下在Java语言中如何实现Dijkstra算法:

    import java.util.*;
    
    class Graph {
        private int V; // 图中顶点的数量
        private int[][] matrix; // 用邻接矩阵表示图
    
        Graph(int v) {
            V = v;
            matrix = new int[V][V];
        }
    
        void addEdge(int src, int dest, int weight) {
            matrix[src][dest] = weight;
            matrix[dest][src] = weight;
        }
    
        int findMinDistance(int[] distance, boolean[] shortestPathTreeSet) {
            int minDistance = Integer.MAX_VALUE;
            int minIndex = -1;
    
            for (int i = 0; i < V; i++) {
                if (!shortestPathTreeSet[i] && distance[i] <= minDistance) {
                    minDistance = distance[i];
                    minIndex = i;
                }
            }
    
            return minIndex;
        }
    
        void printShortestPaths(int[] distance) {
            System.out.println("节点\t\t最短路径");
            for (int i = 0; i < V; i++) {
                System.out.println(i + "\t\t" + distance[i]);
            }
        }
    
        void dijkstra(int src) {
            int[] distance = new int[V];
            boolean[] shortestPathTreeSet = new boolean[V];
    
            for (int i = 0; i < V; i++) {
                distance[i] = Integer.MAX_VALUE;
                shortestPathTreeSet[i] = false;
            }
    
            distance[src] = 0;
    
            for (int count = 0; count < V - 1; count++) {
                int u = findMinDistance(distance, shortestPathTreeSet);
                shortestPathTreeSet[u] = true;
    
                for (int v = 0; v < V; v++) {
                    if (!shortestPathTreeSet[v] && matrix[u][v] != 0
                            && distance[u] != Integer.MAX_VALUE
                            && distance[u] + matrix[u][v] < distance[v]) {
                        distance[v] = distance[u] + matrix[u][v];
                    }
                }
            }
    
            printShortestPaths(distance);
        }
    
        public static void main(String args[]) {
            Graph g = new Graph(6);
    
            g.addEdge(0, 1, 4);
            g.addEdge(0, 2, 3);
            g.addEdge(1, 3, 2);
            g.addEdge(1, 2, 1);
            g.addEdge(2, 3, 4);
            g.addEdge(3, 4, 2);
            g.addEdge(4, 5, 6);
    
            System.out.println("Dijkstra算法最短路径结果:");
    
            g.dijkstra(0);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    在上述代码中,首先我们创建了一个Graph类来表示图数据结构,并使用邻接矩阵来表示图中的边和权重。addEdge()方法用于添加边和权重到邻接矩阵。

    findMinDistance()方法用于找到当前距离最小的节点。它遍历所有未加入最短路径集合(shortestPathTreeSet)的节点,查找距离最小且未加入最短路径集合的节点,并返回其索引。

    printShortestPaths()方法用于打印最短路径结果,输出每个节点与起始节点的最短路径。

    dijkstra()方法是Dijkstra算法的核心部分。它使用一个distance数组来追踪起始节点到其他节点的最短路径长度,shortestPathTreeSet数组用于判断节点是否已经加入最短路径集合。首先,初始化distance数组的值为无穷大(除了起始节点为0),并将起始节点加入最短路径集合。然后,在一个循环中,每次选择距离最小且未加入最短路径集合的节点,将其加入最短路径集合,并更新其邻接节点的最短路径长度。最终得到起始节点到其他所有节点的最短路径。

    main()方法中,我们创建一个Graph对象,并添加了一些边和权重。然后,调用dijkstra()方法以求解最短路径,并打印结果。

    Dijkstra算法是一个经典的解决最短路径问题的算法,在路由算法、导航系统等领域都有广泛的应用。通过Java语言的实现,我们可以更好地理解和应用Dijkstra算法。希望本文对您深入了解Dijkstra算法以及在Java语言中的应用有所帮助。如果您有其他关于图算法的问题,也可以进一步探索和研究相关知识,以提升自己的算法能力。

  • 相关阅读:
    SPI协议
    深度解析RocketMq源码-持久化组件(四) CommitLog
    基于多线程+队列实现生产者和消费者
    [英语单词] tuple 元组
    百度/迅雷/夸克,网盘免费加速,已破!
    MongoDB随记
    【FLY】Android IO性能优化
    MySQL最基本的常识
    C语言基础-结构体
    要想实现超视距低延时图数传输,你还需要一款Mini Homer
  • 原文地址:https://blog.csdn.net/qq_41133533/article/details/132746177