近期我写过了Prim和Kruskal的最小生成树算法,今天,我利用下班时间,给大家分享下Dijkstra的最短距离算法,希望有助于各位的学习。
代码如下:
package org.tree;

import java.util.Arrays;

public class DijkstraArithmetic {

    private static final int INFINITE = 9999;
    public static int[] Pathmatirx ;
    public static int[] shortPathTable ;
   
    public static void shortestPathDijkstra(int[][] matirx, int head, int vertexsSize){
        Pathmatirx = new int[vertexsSize];                   // 用于存储最短路径下标的数组
        shortPathTable = new int[vertexsSize];               // 用于存储到各点最短路径的权值和
       
        int[] flags = new int[vertexsSize];
       
        // 得到该顶点的所有的权
        for (int i = 0; i < vertexsSize; i++) {
            shortPathTable[i] = matirx[head][i];
        }
       
        // 初始化
        flags[head] = 1;                                      // head顶点到head顶点不需要求路径
        shortPathTable[head] = 0;                             // head顶点到head顶点为0
       
        for (int i = 1; i < vertexsSize; i++) {
            int min = INFINITE;
            int minValueIndex = Integer.MAX_VALUE;
           
            // 找到最小的路径,并通过minValueIndex参数标识
            for (int j = 0; j < vertexsSize; j++) {
                if(flags[j] != 1 && shortPathTable[j] < min){
                    min = shortPathTable[j];
                    minValueIndex = j;
                }
            }
           
            // 将目前找到最近的顶点置为1
            flags[minValueIndex] = 1;
           
            // 修正当前最短路径及距离
            for (int j = 0; j < vertexsSize; j++) {
                if( flags[j] != 1 && (min+matirx[minValueIndex][j] < shortPathTable[j])){
                    // 以下说明有更短的路径存在,修改shortPathTable和Pathmatirx
                    shortPathTable[j] = min+matirx[minValueIndex][j];
                    Pathmatirx[j] = minValueIndex;
                }
            }
           
        }
       
    }
   
    public static void main(String[] args) {
        int[][] matrix = new int[5][5];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                matrix[i][j] = INFINITE;
            }
        }
        matrix[0][1] = 10 ;
        matrix[1][0] = 10 ;
       
        matrix[1][3] = 13 ;
        matrix[3][1] = 13 ;
       
        matrix[0][4] = 7 ;
        matrix[4][0] = 7 ;
       
        matrix[0][2] = 3 ;
        matrix[2][0] = 3 ;
       
        matrix[3][4] = 5 ;
        matrix[4][3] = 5;
       
        matrix[2][4] = 2 ;
        matrix[4][2] = 2 ;
       
        shortestPathDijkstra(matrix,3,5);
       
        // 以下是 顶点 matrix[3] 到各个顶点的短距离
        for (int c = 0; c < 5; c++) {
            System.out.println("顶点3到顶点"+c+"的最短距离是"+shortPathTable[c]);
        }
       
    }
   
}

注意:此算法是我在书上看到的,我仅仅只是将原来的C代码翻译成java代码,所以写的原创,请勿乱喷,希望大家学习开心!!!
(时间原因,这里我就不解释了,网上有资料的)