Dijkstra算法

Dijkstra算法

代码中有详细解释,本算法实现采用的是邻接矩阵。

public class MatrixUDG {
     static final int INF = Integer.MAX_VALUE;

     static int[][] mMatrix;
     static char[] mVexs;

     /*public MatrixUDG(char[] mVexs,int[][] mMatrix) {
         this.mVexs = mVexs;
         this.mMatrix = mMatrix;
     }*/

     public static void dijkstra(int node, int[] dist) {

         /*
          * Dijkstra算法
          * 参数说明:
          * @ param node : 起点
          * @ param dist : 长度数组,dist[i]表示从起点到i点的最短路径
          */

        boolean[] flag = new boolean[mVexs.length];

        //对所有顶点进行初始化
         for (int i = 0; i < mVexs.length; i++) {
             flag[i] = false;
             dist[i] = mMatrix[node][i];
         }

         //对顶点node本身进行初始化
         flag[node] = true;
         dist[node] = 0;
         //遍历mVexs.length - 1次,每次找出一个顶点的最短路径
         int k = 0;
         for (int i = 1; i < mVexs.length; i++) {
             int min = INF;
             //寻找最短路径
             for (int j = 0; j < mVexs.length; j++) {
                 if (flag[j] == false && dist[j] < min) {
                     min = dist[j];
                     k = j;
                 }
             }
             flag[k] = true;
             //更新mMatrix的值
             for (int j = 0; j < mVexs.length; j++) {
                 int len = mMatrix[k][j] == INF ? INF : min + mMatrix[k][j];
                 if (flag[j] == false && len < dist[j]) {
                     dist[j] = len;
                 }
             }
         }
         System.out.printf("dijkstra(%c) : \n", mVexs[node]);
         for (int i = 0; i < mVexs.length; i++) {
             System.out.printf("short(%c,%c) = %d\n", mVexs[node],mVexs[i], dist[i]);
         }
    }

    public static void main (String[] args) {
        mVexs = new char[]{'A', 'B', 'C', 'D'};
        mMatrix = new int[][]{
                {0, 1, 2, 1},
                {INF, 0, INF, INF},
                {INF, 3, 0, 1},
                {INF, 1, 1, 0},
        };
        //MatrixUDG udg = new MatrixUDG(mVexs, mMatrix);
        int[] dist = new int[mVexs.length];
        dijkstra(2, dist);
    }
}


时间复杂度:O(n2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值