国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

基于Java實現(xiàn)的Dijkstra算法示例

2019-11-26 15:28:29
字體:
供稿:網(wǎng)友

本文以實例形式介紹了基于Java實現(xiàn)的Dijkstra算法,相信對于讀者研究學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)域算法有一定的幫助。

Dijkstra提出按各頂點與源點v間的路徑長度的遞增次序,生成到各頂點的最短路徑的算法。即先求出長度最短的一條最短路徑,再參照它求出長度次短的一條最短路徑,依次類推,直到從源點v 到其它各頂點的最短路徑全部求出為止。
其代碼實現(xiàn)如下所示:

package com.algorithm.impl;public class Dijkstra { private static int M = 10000; //此路不通 public static void main(String[] args) { int[][] weight1 = {//鄰接矩陣         {0,3,2000,7,M},         {3,0,4,2,M},         {M,4,0,5,4},         {7,2,5,0,6},           {M,M,4,6,0}     };     int[][] weight2 = {         {0,10,M,30,100},         {M,0,50,M,M},         {M,M,0,M,10},         {M,M,20,0,60},         {M,M,M,M,0}     };        int start=0;     int[] shortPath = dijkstra(weight2,start);          for(int i = 0;i < shortPath.length;i++)        System.out.println("從"+start+"出發(fā)到"+i+"的最短距離為:"+shortPath[i]);  }  public static int[] dijkstra(int[][] weight, int start) { //接受一個有向圖的權(quán)重矩陣,和一個起點編號start(從0編號,頂點存在數(shù)組中)     //返回一個int[] 數(shù)組,表示從start到它的最短路徑長度  int n = weight.length;      //頂點個數(shù) int[] shortPath = new int[n];  //保存start到其他各點的最短路徑 String[] path = new String[n];  //保存start到其他各點最短路徑的字符串表示 for(int i=0;i<n;i++)   path[i]=new String(start+"-->"+i);  int[] visited = new int[n];   //標記當(dāng)前該頂點的最短路徑是否已經(jīng)求出,1表示已求出   //初始化,第一個頂點已經(jīng)求出 shortPath[start] = 0; visited[start] = 1;  for(int count = 1; count < n; count++) {   //要加入n-1個頂點  int k = -1;        //選出一個距離初始頂點start最近的未標記頂點   int dmin = Integer.MAX_VALUE;  for(int i = 0; i < n; i++) {  if(visited[i] == 0 && weight[start][i] < dmin) {   dmin = weight[start][i];   k = i;  }  }    //將新選出的頂點標記為已求出最短路徑,且到start的最短路徑就是dmin   shortPath[k] = dmin;  visited[k] = 1;    //以k為中間點,修正從start到未訪問各點的距離   for(int i = 0; i < n; i++) {  if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {   weight[start][i] = weight[start][k] + weight[k][i];   path[i] = path[k] + "-->" + i;   }  } } for(int i = 0; i < n; i++) {  System.out.println("從"+start+"出發(fā)到"+i+"的最短路徑為:"+path[i]); } System.out.println("=====================================");  return shortPath; }}

該程序運行結(jié)果為:

從0出發(fā)到0的最短路徑為:0-->0從0出發(fā)到1的最短路徑為:0-->1從0出發(fā)到2的最短路徑為:0-->3-->2從0出發(fā)到3的最短路徑為:0-->3從0出發(fā)到4的最短路徑為:0-->3-->2-->4=====================================從0出發(fā)到0的最短距離為:0從0出發(fā)到1的最短距離為:10從0出發(fā)到2的最短距離為:50從0出發(fā)到3的最短距離為:30從0出發(fā)到4的最短距離為:60
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 万山特区| 镇巴县| 明溪县| 大埔县| 太湖县| 咸丰县| 巴彦县| 辰溪县| 偃师市| 利川市| 天津市| 黄大仙区| 汕尾市| 三都| 驻马店市| 栖霞市| 高尔夫| 保靖县| 温州市| 元阳县| 安新县| 永和县| 如东县| 邳州市| 武义县| 永定县| 昌江| 鄂托克旗| 额尔古纳市| 都江堰市| 新龙县| 平果县| 和田县| 西林县| 温泉县| 遂昌县| 涞源县| 定边县| 克拉玛依市| 工布江达县| 林甸县|