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