程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於Java完成的Dijkstra算法示例

基於Java完成的Dijkstra算法示例

編輯:關於JAVA

基於Java完成的Dijkstra算法示例。本站提示廣大學習愛好者:(基於Java完成的Dijkstra算法示例)文章只能為提供參考,不一定能成為您想要的結果。以下是基於Java完成的Dijkstra算法示例正文


本文以實例情勢引見了基於Java完成的Dijkstra算法,信任關於讀者研討進修數據構造域算法有必定的贊助。

Dijkstra提出按各極點與源點v間的途徑長度的遞增順序,生成到各極點的最短途徑的算法。即先求出長度最短的一條最短途徑,再參照它求出長度次短的一條最短途徑,順次類推,直到從源點v 到其它各極點的最短途徑全體求出為止。
其代碼完成以下所示:

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+"動身到"+i+"的最短間隔為:"+shortPath[i]); 
 }
 
 public static int[] dijkstra(int[][] weight, int start) {
 //接收一個有向圖的權重矩陣,和一個終點編號start(從0編號,極點存在數組中) 
    //前往一個int[] 數組,表現從start到它的最短途徑長度 
 int n = weight.length;      //極點個數
 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];   //標志以後該極點的最短途徑能否曾經求出,1表現已求出 
 
 //初始化,第一個極點曾經求出
 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+"動身到"+i+"的最短途徑為:"+path[i]);
 }
 System.out.println("====================================="); 
 return shortPath;
 }
}

該法式運轉成果為:

從0動身到0的最短途徑為:0-->0
從0動身到1的最短途徑為:0-->1
從0動身到2的最短途徑為:0-->3-->2
從0動身到3的最短途徑為:0-->3
從0動身到4的最短途徑為:0-->3-->2-->4
=====================================
從0動身到0的最短間隔為:0
從0動身到1的最短間隔為:10
從0動身到2的最短間隔為:50
從0動身到3的最短間隔為:30
從0動身到4的最短間隔為:60
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved