Dijkstra算法的java实现

来源:互联网 发布:免费办公用品软件系统 编辑:程序博客网 时间:2024/06/11 01:05


Dijkstra算法:用于单源最短路径的求解。用于计算给定的一个源节点到其他各个节点之间的最短路径。


该算法的思路是:已选定的节点集为A,待选的节点集为B。开始时节点A中仅包含源节点。

选择B中距离源节点最近的一个点,然后将它加入到节点集A中。该点加入后,更新B中所有节点到A的路径长度(借助刚加入的点)。之后重复这一步骤,直至所有点都加入。


以下图为例,做一个说明:



Dijkstra具体的java实现为:

package com.blyang;public class Dijkstra {private final int INF = Integer.MAX_VALUE;int[][] Matrix;char[] Nodes;public Dijkstra(char[] Nodes, int[][] Matrix){this.Nodes = Nodes;this.Matrix = Matrix;}/** * dijkstra算法 *  * 参数说明: * @param node  起点 * @param distance 长度数组,distance[i]表示从起点到i点的最短路径 */public void dijkstra(int node, int[] distance){boolean[] flag = new boolean[Nodes.length];//初始化for(int i=0; i<Nodes.length; i++){flag[i] = false;distance[i] = Matrix[node][i];}//对顶点node本身进行初始化flag[node] = true;distance[node] = 0;//遍历Nodes.length - 1次,每次找出一个顶点点最短路径int k = 0;for(int i=1; i<Nodes.length; i++){int min = INF;//寻找最短路径for(int j=0; j<Nodes.length; j++){if(flag[j] == false && distance[j] < min){k = j;min = distance[j];}}flag[k] = true;//更新Matrix点值for(int j=0; j<Nodes.length; j++){int len = Matrix[k][j] == INF ? INF : min + Matrix[k][j];if(flag[j] == false && len < distance[j]){distance[j] = len;}}}System.out.printf("Dijkstra(%c): \n", Nodes[node]);for (int i=0; i < Nodes.length; i++)             System.out.printf("  shortest(%c, %c)=%d\n", Nodes[node], Nodes[i], distance[i]);}}


在实现了之后,针对上图的测试代码如下:

package com.blyang;public class Main {public static void main(String[] args) {int INF = Integer.MAX_VALUE;char[] Nodes = {'0', '1', '2', '3'};        int matrix[][] = {                 /*A*//*B*//*C*//*D*/          /*A*/ {    0,   1,   2,   1},          /*B*/ {  INF,   0, INF, INF},          /*C*/ {  INF,   3,   0,   1},          /*D*/ {  INF,   1,   1,   0},          };                int[] dist = new int[Nodes.length];                Dijkstra dijkstra = new Dijkstra(Nodes, matrix);        dijkstra.dijkstra(2, dist);}}



0 0