Java迪杰斯特拉算法(Dijkstra算法)求最短路径

来源:互联网 发布:php curl 的使用 编辑:程序博客网 时间:2024/06/08 04:12

以图片为例实现代码:

路线图

算法步骤图解请参考
http://www.cnblogs.com/skywang12345/p/3711516.html

输出结果
结果

import java.util.Arrays;import java.util.Stack;public class dijkstraShortestPath {    private static char[] points;                           // 顶点集合    private static int[][] arc;                             // 邻接矩阵    private static final int INF = Integer.MAX_VALUE;       // 表示不相连两点间距离为无穷大    //迪杰斯特拉算法    private void dijkstra( int start )    {        boolean[] flag = new boolean[points.length];        //标记节点是否获取最短路径        int[] distence = arc[start] ;                       //标记节点与起点的距离        int[] prev = new int[points.length];                //存储每个节点的前驱        //初始化所有节点的前驱都为起点,为了防止与起点直接相连的点在计算中不更新前驱表        //(这一步很重要,因为每次标记一个点时 更新的是未标记的点前驱,再理解一下)        for( int i=0;i<points.length;i++ )        {            prev[i] = start;                                        }        flag[ start ] = true;         prev[start] = start;        Stack path = new Stack();                           //最后用栈输出路径        int currentSmall = 0 ;                              //currentSmall记录每次迭代中最小值下标        //迭代points.length-1次,每次标记一个最短距离的点        for( int j=1;j<points.length;j++ )        {            int minDistence = INF;                          //标记起点            for( int i=0;i<points.length;i++ )            {                //在未获取最短路径的顶点中,找到离起点最近的节点                if( !flag[i] && distence[i]<minDistence )                {                    minDistence = distence[i];                    currentSmall = i;                       //记录最小距离点的下标                }            }            flag[currentSmall] = true;                      //设置最小距离点的下标为已标记            //更新未标记节点的前驱以及与起点间的最小距离            for( int i=0;i<points.length;i++ )            {                if( !flag[i] )                              //若i还没有标记过                {                    int temp = ( arc[currentSmall][i]==INF ? INF : ( minDistence + arc[currentSmall][i] ) );                    if( temp<distence[i] )                  //若更新后距离比原先小                    {                        distence[i] = temp;                 //更新距离                        prev[i] = currentSmall;             //更新前驱                    }                }            }        }        //输出各个节点与起点的最短距离,以及最短路径        System.out.printf("dijkstra(%c): \n", points[start]);        for (int i=0; i < points.length; i++)        {            //倒叙取出前驱直到起点结束            int j = prev[i];            while( j!=start )            {                path.push(points[j]);                       //前驱入栈                j = prev[j];                                //前驱的前驱            }            System.out.print( "shortestDistenct("+points[start]+","+points[i]+") = "+distence[i]+"   ");            System.out.print("path = " + points[start] + " ");            while( !path.isEmpty() )            {                System.out.print(path.pop()+" ");            }            System.out.println(points[i]);        }    }    public static void main( String[] args )     {        dijkstraShortestPath dsp = new dijkstraShortestPath();         points = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G'};         arc = new int[][]        {                     /*A*//*B*//*C*//*D*//*E*//*F*//*G*/              /*A*/ {   0,  12, INF, INF, INF,  16,  14},              /*B*/ {  12,   0,  10, INF, INF,   7, INF},              /*C*/ { INF,  10,   0,   3,   5,   6, INF},              /*D*/ { INF, INF,   3,   0,   4, INF, INF},              /*E*/ { INF, INF,   5,   4,   0,   2,   8},              /*F*/ {  16,   7,   6, INF,   2,   0,   9},              /*G*/ {  14, INF, INF, INF,   8,   9,   0}         };         dsp.dijkstra(3);    }}

本文图片和数据来源:
http://www.cnblogs.com/skywang12345/

0 0
原创粉丝点击