動態規劃之求最短路徑(java版)

2021-07-30 12:34:13 字數 1068 閱讀 5798

求最短路徑眾所周知有dijistra演算法、bellman-ford等,除了這些演算法,用動態規劃也可以求出最短路徑,時間複雜度為o(n^2),跟沒有優化的dijistra演算法一樣(優化後的dijistra演算法時間複雜度為o((m+n)lgn))。

首先這裡有15個結點,表現出來的矩陣為

左側1-15表示前乙個節點,最上面一行1-15表示後乙個節點,記這個圖的矩陣為p,那麼p[0][1]==5表示節點0與節點1相連,路徑長度為5。那麼我們如何利用動態規劃來求解最短路徑?

首先我們需要把整個問題轉換成小的子問題,利用小的子問題的最優解求出整個問題的最優解。

我們的目的是求0-15之間的最短路徑,由圖可知與節點15相連的是結點14和節點13,假設我們已經求出0-13的最短路徑的值d13和0-14的最短路徑的值d14,那麼我們只需要比較d13+d(13-15)和d14+d(14-15)的大小就可以知道從哪個節點出發到節點15的路徑最短。按照這個思想一直往前推,推到節點0時結束,自然就求出了節點0-節點15的最短路徑,這個思路是遞迴的,如果用遞迴的方法,時間複雜度很高,當然你也可以用備忘錄,記錄已經計算過的值,我這裡將遞迴轉換成迭代。

我們先定義乙個類class node,裡面儲存節點的序號、從0到這個節點的最短路徑的值、前乙個節點的序號。

class node
圖的矩陣自己存一下,我這裡不寫了

//從矩陣a的第一行開始,一行行找相連的節點

for(int i = 0;i<16;i++)}}

}

最後將n[15].value列印出來就是最短路徑的值,再根據parent的值往前找就得到最短路徑的解,當然這個例子有不同的路徑的解,雖然值一樣,我這裡只給了一種。

動態規劃之Dijkstra演算法求最短路徑

問題描述 王老師家住在a地,他要去學生b c d e f h家進行家訪,已知每個學生家之間的距離,現在求王老師家到每個學生家的最短路徑,好讓王老師做出計畫。思路分析 用圖的鄰接矩陣matrix表示各地之間的距離,a到j的最短路徑表示為dist j min 動態規劃的遞推公式 dist j 初始化為m...

動態規劃最短路徑問題

最短路徑問題 下圖給出了一張地圖,地圖中每個頂點代表乙個城市,兩個城市間的連線代表道路,連線上的數值代表道路長度,求從a地到e地的最短路徑。分析 本題可以利用深度搜尋法求解,偽 如下 vars 未訪問的城市集合 dist i,j 儲存任意兩個城市間的距離陣列 function search city...

最短路 求最長最短路,求最短路的路徑

hdu 1595 find the longest of the shortest include include include include include include include include include include include include include defi...