圖的最短路徑-Dijkstra算法

/**
     * 統計最短路徑的算法
     * Dijkstra.統計圖中頂點v到其餘各頂點的最短路徑
     *
     * @param vs   起始頂點,即計算頂點vs到其餘頂點的最短路徑
     * @param prev 前驅頂點數組,即prev[i]的值是頂點vs到頂點i的最短路徑所經歷的所有頂點中,位於頂點i以前的那個頂點
     * @param dist 長度數組,即dist[i]是頂點vs到頂點i的最短路徑長度
     */
    public void dijkstra(int vs, int[] prev, int[] dist) {
        //flag[i]=true表示頂點vs到頂點i的最短路徑已成功獲取
        boolean[] flag = new boolean[mVexs.length];
        //初始化
        for (int i = 0; i < mVexs.length; i++) {
            flag[i] = false;
            prev[i] = 0;
            dist[i] = getWeight(vs, i);
        }

        //對頂點vs自身進行初始化
        flag[vs] = true;
        dist[vs] = 0;
        int k = 0;

        for (int i = 1; i < mVexs.length; i++) {
            /**
             * 尋找最小的路徑,即在未獲取路徑的頂點中,尋找離vs最近的頂點k
             */
            int min = INF;
            for (int j = 0; j < mVexs.length; j++) {
                if (flag[j] == false && dist[j] < min) {
                    min = dist[j];
                    k = j;

                }
            }
            //標記k爲已獲取到最短路徑
            flag[k] = true;

            for(int j=0;j<mVexs.length;j++){
                int tmp = getWeight(k,j);
                tmp = (tmp==INF?INF:(tmp+min));
                if(flag[j]==false&&tmp<dist[j]){
                    dist[j]=tmp;
                    prev[j]=k;
                    
                }
            }
        }

        //打印dijkstara最短路徑的結果
        System.out.println("dijkstra:"+mVexs[vs].data);
        for(int i=0;i<mVexs.length;i++){
            System.out.println(mVexs[vs].data+"->"+mVexs[i].data+" : "+dist[i]);
        }

    }
相關文章
相關標籤/搜索