最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)Dijkstra算法

 更新時(shí)間:2020年05月27日 14:38:54   作者:南 墻  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)Dijkstra算法的具體代碼,供大家參考,具體內(nèi)容如下

1 問題描述

何為Dijkstra算法?

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

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

2 解決方案

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

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

2.2 具體編碼

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

注意,Dijkstra算法只能應(yīng)用于不含負(fù)權(quán)值的圖。因?yàn)樵诖蠖鄶?shù)應(yīng)用中這個(gè)條件都滿足,所以這種局限性并沒有影響Dijkstra算法的廣泛應(yīng)用。

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

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

package com.liuzhen.chapter9;

public class Dijkstra {
  /*
   * 參數(shù)adjMatrix:為圖的權(quán)重矩陣,權(quán)值為-1的兩個(gè)頂點(diǎn)表示不能直接相連
   * 函數(shù)功能:返回頂點(diǎn)0到其它所有頂點(diǎn)的最短距離,其中頂點(diǎn)0到頂點(diǎn)0的最短距離為0
   */
  public int[] getShortestPaths(int[][] adjMatrix) {
    int[] result = new int[adjMatrix.length];  //用于存放頂點(diǎn)0到其它頂點(diǎn)的最短距離
    boolean[] used = new boolean[adjMatrix.length]; //用于判斷頂點(diǎn)是否被遍歷
    used[0] = true; //表示頂點(diǎn)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;  //用于暫時(shí)存放頂點(diǎn)0到i的最短距離,初始化為Integer型最大值
      int k = 0;
      for(int j = 1;j < adjMatrix.length;j++) { //找到頂點(diǎn)0到其它頂點(diǎn)中距離最小的一個(gè)頂點(diǎn)
        if(!used[j] && result[j] != -1 && min > result[j]) {
          min = result[j];
          k = j;
        }
      }
      used[k] = true;  //將距離最小的頂點(diǎn),記為已遍歷
      for(int j = 1;j < adjMatrix.length;j++) { //然后,將頂點(diǎn)0到其它頂點(diǎn)的距離與加入中間頂點(diǎn)k之后的距離進(jìn)行比較,更新最短距離
        if(!used[j]) { //當(dāng)頂點(diǎn)j未被遍歷時(shí)
          //首先,頂點(diǎn)k到頂點(diǎn)j要能通行;這時(shí),當(dāng)頂點(diǎn)0到頂點(diǎn)j的距離大于頂點(diǎn)0到k再到j(luò)的距離或者頂點(diǎn)0無法直接到達(dá)頂點(diǎn)j時(shí),更新頂點(diǎn)0到頂點(diǎn)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("頂點(diǎn)0到圖中所有頂點(diǎn)之間的最短距離為:");
    for(int i = 0;i < result.length;i++) 
      System.out.print(result[i]+" ");
  }
}

運(yùn)行結(jié)果:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用JAVA實(shí)現(xiàn)楊輝三角實(shí)例

    用JAVA實(shí)現(xiàn)楊輝三角實(shí)例

    大家好,本篇文章主要講的是用JAVA實(shí)現(xiàn)楊輝三角實(shí)例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Java截取字符串的幾種方法示例

    Java截取字符串的幾種方法示例

    眾所周知java提供了很多字符串截取的方式,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java截取字符串的幾種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Springboot2.0自適應(yīng)效果錯誤響應(yīng)過程解析

    Springboot2.0自適應(yīng)效果錯誤響應(yīng)過程解析

    這篇文章主要介紹了Springboot2.0自適應(yīng)效果錯誤響應(yīng)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解Spring中的AOP及AspectJ五大通知注解

    詳解Spring中的AOP及AspectJ五大通知注解

    這篇文章主要介紹了詳解Spring中的AOP及AspectJ五大通知注解,AOP面向切面編程是一種新的方法論,是對傳統(tǒng)OOP面向?qū)ο缶幊痰难a(bǔ)充,AOP?的主要編程對象是切面(aspect),切面模塊化橫切關(guān)注點(diǎn),需要的朋友可以參考下
    2023-08-08
  • CountDownLatch基于AQS阻塞工具用法詳解

    CountDownLatch基于AQS阻塞工具用法詳解

    這篇文章主要為大家介紹了CountDownLatch基于AQS阻塞工具用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • java編程實(shí)現(xiàn)多人聊天室功能

    java編程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了java編程實(shí)現(xiàn)多人聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • springboot整合xxl-job的實(shí)現(xiàn)示例

    springboot整合xxl-job的實(shí)現(xiàn)示例

    本文主要介紹了springboot整合xxl-job的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • spring應(yīng)用中多次讀取http post方法中的流遇到的問題

    spring應(yīng)用中多次讀取http post方法中的流遇到的問題

    這篇文章主要介紹了spring應(yīng)用中多次讀取http post方法中的流,文中給大家列舉處理問題描述及解決方法,需要的朋友可以參考下
    2018-11-11
  • Java 數(shù)組元素倒序的三種方式(小結(jié))

    Java 數(shù)組元素倒序的三種方式(小結(jié))

    這篇文章主要介紹了Java 數(shù)組元素倒序的三種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java網(wǎng)上圖書商城(3)Book模塊

    java網(wǎng)上圖書商城(3)Book模塊

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上圖書商城,Book模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評論

娄底市| 内丘县| 弥勒县| 泽库县| 南华县| 军事| 南城县| 景泰县| 娄烦县| 龙游县| 柳州市| 芒康县| 湖州市| 彰化市| 石泉县| 济宁市| 济宁市| 都兰县| 五华县| 睢宁县| 芜湖县| 邵武市| 铜川市| 定襄县| 临沧市| 自治县| 和硕县| 永善县| 白玉县| 海宁市| 泽州县| 井研县| 博客| 精河县| 赤水市| 宝应县| 镇巴县| 舒城县| 东乡| 夏邑县| 宜昌市|