dijstra算法,求源點到各個頂點的最短距離

1:dijstra算法經常使用語求最短距離,java

dijstra每次從未發現節點n[]中,發現距離源點最短的節點m,求出最短節點後,將m添加到已發現節點y[]中,用該節點m進行更新其它未發現節點n[]-m的最短距離。直到發現全部節點算法

證實:m爲何是距離源點s的最短距離, this

         由於在未發現節點中該節點距離最短,因此不會有從s到n[]-m再到m的距離和小於s到m。spa

          在已發現節點y[]中,從s到y[]再到m的距離和,若是有小於s到m的距離,那麼在求得s>y[i]的最短距離時,就已經用(s>y[i])+(y[i]>m)替換掉s>m的距離了。因此不會存在這種狀況code

代碼:blog

package com.li.chapter24.mydijstra;

import java.io.InputStream;
import java.util.Scanner;

/**
 * @program: GradleTestUseSubModule
 * @author: Yafei Li
 * @create: 2018-06-28 19:45
 *   本身編寫迪傑斯特拉算法  ,解決圖論及其應用 1.4節  a到b的最短路問題
 **/
public class MyDijStraAlgorithm {

    public static void main(String[] args){
        MyDijStraAlgorithm dijStraAlgorithm=new MyDijStraAlgorithm();
        int[] minDisArr = dijStraAlgorithm.dijstra(0);  
        for (int i = 0; i < minDisArr.length; i++) {
            System.out.println(minDisArr[i]);
        }
    }
    //vertx輸入的源點
    public int[] dijstra(int vertx) {

        int[][] arrWeight=getArrOfGraph();
        int[] arrVertx = arrWeight[vertx];   //其它節點與vertx的距離

        boolean[] isFound = new boolean[arrVertx.length];
        isFound[vertx]=true;

        for (int i = 0; i < arrVertx.length; i++) {  //遍歷全部的點
            int mindis=Integer.MAX_VALUE;
            int v=vertx;
            for (int j = 0; j < arrVertx.length; j++) {
                if (!isFound[j]) {
                    if (mindis > arrVertx[j]) {
                        mindis = arrVertx[j];
                        v=j;
                    }
                }
            }

            isFound[v]=true;

            for (int j = 0; j < arrVertx.length; j++) {
                if (!isFound[j]) {
                    if (mindis + arrWeight[v][j] < arrVertx[j]) {  //vertx到v的距離加上v到j的距離
                        arrVertx[j]=mindis + arrWeight[v][j];
                    }
                }
            }
        }
        return arrVertx;

    }


    public int[][] getArrOfGraph() {
        Class clazz = this.getClass();
        InputStream ins = clazz.getResourceAsStream("/data2.txt");
        Scanner scanner = new Scanner(ins);
        int[][] intarr = new int[8][8];
        int row=0;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            String[] strarr = line.split(" ");
            for (int i = 0; i < strarr.length; i++) {
                intarr[row][i] = Integer.parseInt(strarr[i]);
            }
            row++;
        }
        return intarr;
    }
}

下面爲數據,放到resource下get

下面的數據表示,行號,列號表明節點 ,節點爲0-7it

其中8表示爲 第0個節點到第4個節點的距離爲8io

999表明兩個節點之間沒有相鄰,說明它們的距離無窮大class

0 2 999 999 8 999 1 999
2 0 1 999 6 999 999 999
999 1 0 9 4 3 999 999
999 999 9 0 999 6 999 2
8 6 4 999 0 2 7 2
999 999 3 6 2 0 999 4
1 999 999 999 7 999 0 9
999 999 999 2 2 4 9 0
相關文章
相關標籤/搜索