日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

解决最短路径的Dijkstra算法详解,附加Java代码

發布時間:2025/3/19 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决最短路径的Dijkstra算法详解,附加Java代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 最短路徑問題

最短路徑問題是生活中經常碰到的一類問題,如機器人路徑規劃,數學競賽以及真實的工程施工問題;甚至是我們程序員筆試必刷算法題。其實問題很簡單,就是有很多個節點,我們要計算出一個初始點到各個節點的最短距離(或者得到最短路徑的表示),如下圖,怎么找出A點到其它各個點的最短路徑及距離? 人眼掃描得到的結果:A到B、C、D……G距離為 [4, 14, 7, 7, 10, 12],人眼對付7個點還是綽綽有余的,什么?你掃描的結果和我不一樣?那咱們還是分析一下原理,然后寫個代碼來處理一下。

2. Dijkstra算法?

2.1 基本原理:有一個數組記錄了各個節點到初始節點的距離,該數組初始值是無窮大,然后如果選擇A點作為起始點,那么修改數組中A到A的距離為0,并且更新那些與A直接連接的節點值,并把A標記為已訪問,接下來,從距離數組中選擇距離最小值,也就是B點,循環...

假設我們是要計算其它各點和A點的最短距離

  • 我們選取A點作為出發點,那么很明顯,我們只可以從和A點有直接聯系的B、E點中選擇一個最短路徑點。先取出距離A點路徑長度為4的B點,B點確定,那么我們記錄B點以及B點和A的距離為{B(4)}
  • 此時我們要從和A有直接關系的E點以及通過B和A有間接關系的C、D點中選擇最短路徑點;E和D距離A都是7,我們隨便取一個,假如選擇D點,D點確定,記錄D點以及D點和A的距離為{B(4)、D(7)}
  • 接下來我們從和A有直接關系的E點以及通過B和A有間接關系的C,通過B、D和A有間接關系的F、G中選擇最短路徑點;此時E距離A最近為7,E點確定,記錄E點以及E點和A的距離為{B(4)、D(7)、E(7)}。
  • ……
  • 2.2 代碼編寫

    我們大腦很容易分析這種7個點的最短路徑,那如果是成百上千個點,錯綜復雜,我們大腦可能是不夠用,通過代碼是最有效的解決辦法,但代碼邏輯也有點難理解,接下來就好好地理解一下。

    2.2.1 數據初始化

    我們先將圖中的各個點以及它們之間的路徑距離轉化成二維數組,如下圖。

    2.2.2? 結果記錄初始化

    為了保存結果,我們得對記錄結果的數組進行初始化。主要有兩個:一個是記錄哪些點到A點的距離已經確定下來的數組,另一個是記錄每個點到A點的距離。

    2.2.3 初始點的選擇

    我們這里計算各個點到A點的最短距離。

    2.2.4 循環計算每個點和A點的距離,更新distance數組以及isVisit數組

    2.2.5 運行結果

    2.2.6?代碼的話,由于變量和數組有點多,所以不太容易理解,而且也不太好分析,所以需要同學們自己耐心對照2.1基本原理理解,因為2.1的思路還是比較簡單清晰,理解思路之后,再來理解代碼好一些

    3. 完整的Java代碼如下

    public static void main(String[] args) {int inf = 100;// 初始化節點數為7int node = 7;// 各個點之間的路徑長度,inf表示不連通int[][] map = {// 從左往右,從上往下依次表示A、B、C、D、E、F、G{inf, 4, inf, inf, 7, inf, inf},{4, inf, 15, 3, inf, inf, inf},{inf, 15, inf, inf, inf, inf, 2 },{inf, 3, inf, inf, 5, 3, 5 },{7, inf, inf, 5, inf, 6, inf},{inf, inf, inf, 3, 6, inf, inf},{inf, inf, 2, 5, inf, inf, inf}};// 記錄哪些點已經確定了,確定為true,否則為默認值falseboolean[] isVisit = new boolean[node];// 記錄每個點距離初始點的距離int[] distance = new int[node];// 初始值為inf,表示無窮大Arrays.fill(distance, inf);// 選擇A作為初始點,0下標代表A,int initNode = 0;// A點到自己的距離為0distance[initNode] = 0;// 同時將isVisit數組元素A的下標0設置為true,表示A點已確定isVisit[initNode] = true;int currNode = initNode;int certainDistance = distance[currNode];// 只需計算其余6個點距離A點的距離,每次循環得到一個點,循環6次即可for (int loop = 1; loop < node; loop++) {// 循環計算和currNode有關系節點的距離,第一次currNode是A點for (int i = 0; i < map[currNode].length; i++) {// 以探索點距初始點的距離加上各點和探索點的距離更新distance矩陣int tmp = certainDistance + map[currNode][i];if(tmp < distance[i]){distance[i] = tmp;}}// 挑選還未訪問,并且距離初始點最近的點作為探索點currNode = getMin(distance, isVisit, inf);// 將該探索點標記為true“已訪問”,isVisit[currNode] = true;// 并且得到該點和A點的距離certainDistance = distance[currNode];}char[] str = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};for (int i = 0; i < node; i++) {System.out.println(str[i] + "到" + str[initNode] + "的距離為 " + distance[i]);}}static int getMin(int[] dis, boolean[] isVisit, int inf){int min = -1;int minVal = inf;for (int i = 0; i < dis.length; i++) {// 掃描isVisit還未訪問的節點,并且該節點是distance矩陣最小的數if((!isVisit[i]) && (dis[i] < minVal)){minVal = dis[i];min = i;}}return min;}

    總結

    以上是生活随笔為你收集整理的解决最短路径的Dijkstra算法详解,附加Java代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。