国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

java實現Dijkstra算法

瀏覽:2日期:2022-09-01 08:43:05

本文實例為大家分享了java實現Dijkstra算法的具體代碼,供大家參考,具體內容如下

1 問題描述

何為Dijkstra算法?

Dijkstra算法功能:給出加權連通圖中一個頂點,稱之為起點,找出起點到其它所有頂點之間的最短距離。

Dijkstra算法思想:采用貪心法思想,進行n-1次查找(PS:n為加權連通圖的頂點總個數,除去起點,則剩下n-1個頂點),第一次進行查找,找出距離起點最近的一個頂點,標記為已遍歷;下一次進行查找時,從未被遍歷中的頂點尋找距離起點最近的一個頂點, 標記為已遍歷;直到n-1次查找完畢,結束查找,返回最終結果。

2 解決方案

2.1 使用Dijkstra算法得到最短距離示例

此處借用文末參考資料1博客中一個插圖(PS:個人感覺此圖描述簡單易懂):

java實現Dijkstra算法

java實現Dijkstra算法

2.2 具體編碼

Dijkstra復雜度是O(N^2),如果用binary heap優(yōu)化可以達到O((E+N)logN),用fibonacci heap可以優(yōu)化到O(NlogN+E) 。

注意,Dijkstra算法只能應用于不含負權值的圖。因為在大多數應用中這個條件都滿足,所以這種局限性并沒有影響Dijkstra算法的廣泛應用。

其次,大家要注意把Dijkstra算法與尋找最小生成樹的Prim算法區(qū)分開來。兩者都是運行貪心法思想,但是Dijkstra算法是比較路徑的長度,所以必須把起點到相應頂點之間的邊的權重相加,而Prim算法則是直接比較相應邊給定的權重。

下面的代碼時間復雜度為O(N^2),代碼中所用圖為2.1使用Dijkstra算法得到最短距離示例中所給的圖。

package com.liuzhen.chapter9;public class Dijkstra { /* * 參數adjMatrix:為圖的權重矩陣,權值為-1的兩個頂點表示不能直接相連 * 函數功能:返回頂點0到其它所有頂點的最短距離,其中頂點0到頂點0的最短距離為0 */ public int[] getShortestPaths(int[][] adjMatrix) { int[] result = new int[adjMatrix.length]; //用于存放頂點0到其它頂點的最短距離 boolean[] used = new boolean[adjMatrix.length]; //用于判斷頂點是否被遍歷 used[0] = true; //表示頂點0已被遍歷 for(int i = 1;i < adjMatrix.length;i++) { result[i] = adjMatrix[0][i]; used[i] = false; } for(int i = 1;i < adjMatrix.length;i++) { int min = Integer.MAX_VALUE; //用于暫時存放頂點0到i的最短距離,初始化為Integer型最大值 int k = 0; for(int j = 1;j < adjMatrix.length;j++) { //找到頂點0到其它頂點中距離最小的一個頂點if(!used[j] && result[j] != -1 && min > result[j]) { min = result[j]; k = j;} } used[k] = true; //將距離最小的頂點,記為已遍歷 for(int j = 1;j < adjMatrix.length;j++) { //然后,將頂點0到其它頂點的距離與加入中間頂點k之后的距離進行比較,更新最短距離if(!used[j]) { //當頂點j未被遍歷時 //首先,頂點k到頂點j要能通行;這時,當頂點0到頂點j的距離大于頂點0到k再到j的距離或者頂點0無法直接到達頂點j時,更新頂點0到頂點j的最短距離 if(adjMatrix[k][j] != -1 && (result[j] > min + adjMatrix[k][j] || result[j] == -1)) result[j] = min + adjMatrix[k][j];} } } return result; } public static void main(String[] args) { Dijkstra test = new Dijkstra(); int[][] adjMatrix = {{0,6,3,-1,-1,-1},{6,0,2,5,-1,-1},{3,2,0,3,4,-1},{-1,5,3,0,2,3},{-1,-1,4,2,0,5},{-1,-1,-1,3,5,0}}; int[] result = test.getShortestPaths(adjMatrix); System.out.println('頂點0到圖中所有頂點之間的最短距離為:'); for(int i = 0;i < result.length;i++) System.out.print(result[i]+' '); }}

運行結果:

頂點0到圖中所有頂點之間的最短距離為:0 5 3 6 7 9

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 午夜dj视频完整社区 | 亚洲韩精品欧美一区二区三区 | 亚洲黄视频在线观看 | 国产一区日韩二区欧美三 | 俄罗斯黄色一级片 | 美女福利视频国产片 | 九九九精品视频免费 | 日韩亚洲欧美一区二区三区 | 欧美精品另类 | 夜色综合 | 国产的一级毛片完整 | 中国日本高清免费视频网 | 人碰人碰人成人免费视频 | 亚洲视频在线网 | 绝对真实偷拍盗摄高清在线视频 | 欧美粗又大gay69视频 | 日韩一区二区三区精品 | 国产美女午夜精品福利视频 | 亚洲天堂一区 | 成人午夜在线视频 | 欧美成人精品欧美一级乱黄 | 久久99精品久久久久久久野外 | 午夜爽爽 | 99久久精品免费视频 | 欧美日韩色黄大片在线视频 | 99精品国产综合久久久久 | 国产亚洲一区二区手机在线观看 | 国产黄色在线网站 | 欧美亚洲国产片在线观看 | 国产精品日产三级在线观看 | 男人天堂男人天堂 | 精品在线一区二区三区 | 国产成人精品午夜二三区 | 欧美白人和黑人xxxx猛交视频 | 免费人成在观看 | 国产午夜精品久久久久小说 | 久久国内精品 | 一级特黄性色生活片一区二区 | 9丨精品国产高清自在线看 ⅹxx中国xxx人妖 | 亚洲精品国产专区91在线 | 欧美在线成人免费国产 |