亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中Dijkstra算法求解最短路徑的實現(xiàn)

 更新時間:2023年09月08日 08:55:47   作者:微笑的Java  
Dijkstra算法是一種解決最短路徑問題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

導(dǎo)語:Dijkstra算法是一種解決最短路徑問題的常用算法。在本文中,我們將深入探討Dijkstra算法在Java語言中的實現(xiàn)原理,并給出相應(yīng)的代碼示例。

介紹最短路徑問題:最短路徑問題是計算機科學(xué)中的經(jīng)典問題之一,它可以應(yīng)用于許多領(lǐng)域,如路由算法、航班規(guī)劃和導(dǎo)航系統(tǒng)等。最短路徑算法的目標(biāo)是找到從給定節(jié)點到其他所有節(jié)點的最短路徑。

Dijkstra算法簡介:Dijkstra算法是由荷蘭計算機科學(xué)家Edsger W. Dijkstra提出的,用于解決最短路徑問題。它通過逐步選擇距離起始節(jié)點最近的節(jié)點,并更新其鄰接節(jié)點的最短距離,最終得到起始節(jié)點到其他所有節(jié)點的最短路徑。

Dijkstra算法的步驟如下:

  • 創(chuàng)建一個距離數(shù)組distance[],其中distance[i]表示從起始節(jié)點到節(jié)點i的最短路徑距離。將距離數(shù)組所有元素初始化為正無窮。
  • 將起始節(jié)點的距離distance[src]設(shè)置為0。
  • 創(chuàng)建一個最短路徑集合shortestPathSet[],用于標(biāo)記已經(jīng)求得最短路徑的節(jié)點。
  • 對于每個節(jié)點,重復(fù)以下步驟:
    a. 選擇未加入最短路徑集合的距離最小的節(jié)點u。
    b. 將節(jié)點u加入最短路徑集合shortestPathSet[]。
    c. 更新節(jié)點u的鄰接節(jié)點v的最短路徑距離,如果從起始節(jié)點到節(jié)點u的距離加上節(jié)點u到節(jié)點v的距離小于distance[v],則更新distance[v]的值為新的最短路徑距離。
  • 最終得到起始節(jié)點到其他所有節(jié)點的最短路徑。

現(xiàn)在,讓我們看一下在Java語言中如何實現(xiàn)Dijkstra算法:

import java.util.*;

class Graph {
    private int V; // 圖中頂點的數(shù)量
    private int[][] matrix; // 用鄰接矩陣表示圖

    Graph(int v) {
        V = v;
        matrix = new int[V][V];
    }

    void addEdge(int src, int dest, int weight) {
        matrix[src][dest] = weight;
        matrix[dest][src] = weight;
    }

    int findMinDistance(int[] distance, boolean[] shortestPathTreeSet) {
        int minDistance = Integer.MAX_VALUE;
        int minIndex = -1;

        for (int i = 0; i < V; i++) {
            if (!shortestPathTreeSet[i] && distance[i] <= minDistance) {
                minDistance = distance[i];
                minIndex = i;
            }
        }

        return minIndex;
    }

    void printShortestPaths(int[] distance) {
        System.out.println("節(jié)點\t\t最短路徑");
        for (int i = 0; i < V; i++) {
            System.out.println(i + "\t\t" + distance[i]);
        }
    }

    void dijkstra(int src) {
        int[] distance = new int[V];
        boolean[] shortestPathTreeSet = new boolean[V];

        for (int i = 0; i < V; i++) {
            distance[i] = Integer.MAX_VALUE;
            shortestPathTreeSet[i] = false;
        }

        distance[src] = 0;

        for (int count = 0; count < V - 1; count++) {
            int u = findMinDistance(distance, shortestPathTreeSet);
            shortestPathTreeSet[u] = true;

            for (int v = 0; v < V; v++) {
                if (!shortestPathTreeSet[v] && matrix[u][v] != 0
                        && distance[u] != Integer.MAX_VALUE
                        && distance[u] + matrix[u][v] < distance[v]) {
                    distance[v] = distance[u] + matrix[u][v];
                }
            }
        }

        printShortestPaths(distance);
    }

    public static void main(String args[]) {
        Graph g = new Graph(6);

        g.addEdge(0, 1, 4);
        g.addEdge(0, 2, 3);
        g.addEdge(1, 3, 2);
        g.addEdge(1, 2, 1);
        g.addEdge(2, 3, 4);
        g.addEdge(3, 4, 2);
        g.addEdge(4, 5, 6);

        System.out.println("Dijkstra算法最短路徑結(jié)果:");

        g.dijkstra(0);
    }
}

在上述代碼中,首先我們創(chuàng)建了一個Graph類來表示圖數(shù)據(jù)結(jié)構(gòu),并使用鄰接矩陣來表示圖中的邊和權(quán)重。addEdge()方法用于添加邊和權(quán)重到鄰接矩陣。

findMinDistance()方法用于找到當(dāng)前距離最小的節(jié)點。它遍歷所有未加入最短路徑集合(shortestPathTreeSet)的節(jié)點,查找距離最小且未加入最短路徑集合的節(jié)點,并返回其索引。

printShortestPaths()方法用于打印最短路徑結(jié)果,輸出每個節(jié)點與起始節(jié)點的最短路徑。

dijkstra()方法是Dijkstra算法的核心部分。它使用一個distance數(shù)組來追蹤起始節(jié)點到其他節(jié)點的最短路徑長度,shortestPathTreeSet數(shù)組用于判斷節(jié)點是否已經(jīng)加入最短路徑集合。首先,初始化distance數(shù)組的值為無窮大(除了起始節(jié)點為0),并將起始節(jié)點加入最短路徑集合。然后,在一個循環(huán)中,每次選擇距離最小且未加入最短路徑集合的節(jié)點,將其加入最短路徑集合,并更新其鄰接節(jié)點的最短路徑長度。最終得到起始節(jié)點到其他所有節(jié)點的最短路徑。

main()方法中,我們創(chuàng)建一個Graph對象,并添加了一些邊和權(quán)重。然后,調(diào)用dijkstra()方法以求解最短路徑,并打印結(jié)果。

Dijkstra算法是一個經(jīng)典的解決最短路徑問題的算法,在路由算法、導(dǎo)航系統(tǒng)等領(lǐng)域都有廣泛的應(yīng)用。通過Java語言的實現(xiàn),我們可以更好地理解和應(yīng)用Dijkstra算法。希望本文對您深入了解Dijkstra算法以及在Java語言中的應(yīng)用有所幫助。如果您有其他關(guān)于圖算法的問題,也可以進(jìn)一步探索和研究相關(guān)知識,以提升自己的算法能力。

到此這篇關(guān)于Java中Dijkstra算法求解最短路徑的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java Dijkstra最短路徑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 中使用匿名類直接new接口詳解及實例代碼

    java 中使用匿名類直接new接口詳解及實例代碼

    這篇文章主要介紹了java 中使用匿名類直接new接口詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳細(xì)聊聊JDK中的反模式接口常量

    詳細(xì)聊聊JDK中的反模式接口常量

    這篇文章主要給大家介紹了關(guān)于JDK中反模式接口常量的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用jdk具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • SpringBoot中l(wèi)ogback日志保存到mongoDB的方法

    SpringBoot中l(wèi)ogback日志保存到mongoDB的方法

    這篇文章主要介紹了SpringBoot中l(wèi)ogback日志保存到mongoDB的方法,
    2017-11-11
  • Java基礎(chǔ)之反射技術(shù)相關(guān)知識總結(jié)

    Java基礎(chǔ)之反射技術(shù)相關(guān)知識總結(jié)

    今天帶大家復(fù)習(xí)Java基礎(chǔ)知識,文中對Java反射技術(shù)介紹的非常詳細(xì),對正在學(xué)習(xí)Java的小伙伴們很有幫助,,需要的朋友可以參考下
    2021-05-05
  • JavaFX實現(xiàn)石頭剪刀布小游戲

    JavaFX實現(xiàn)石頭剪刀布小游戲

    這篇文章主要為大家詳細(xì)介紹了JavaFX實現(xiàn)石頭剪刀布小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java?Stream如何將List分組成Map或LinkedHashMap

    Java?Stream如何將List分組成Map或LinkedHashMap

    這篇文章主要給大家介紹了關(guān)于Java?Stream如何將List分組成Map或LinkedHashMap的相關(guān)資料,stream流是Java8的新特性,極大簡化了集合的處理操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 老生常談Java反射機制(必看篇)

    老生常談Java反射機制(必看篇)

    下面小編就為大家?guī)硪黄仙U凧ava反射機制(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java?mybatis?開發(fā)自定義插件

    Java?mybatis?開發(fā)自定義插件

    這篇文章主要介紹了Java?mybatis開發(fā)自定義插件,MyBatis允許你在映射語句執(zhí)行過程中的某一點進(jìn)行攔截調(diào)用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Spring數(shù)據(jù)庫事務(wù)的實現(xiàn)機制講解

    Spring數(shù)據(jù)庫事務(wù)的實現(xiàn)機制講解

    這篇文章主要介紹了Spring數(shù)據(jù)庫事務(wù)的實現(xiàn)機制講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 多線程實例詳解(三)

    Java 多線程實例詳解(三)

    本文主要介紹 java 線程安全的知識,這里整理了相關(guān)資料及實現(xiàn)示例代碼,有興趣的小伙伴可以參考下
    2016-09-09

最新評論