国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java實(shí)現(xiàn)迪杰斯特拉(Dijkstra)算法求解最短路問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了java實(shí)現(xiàn)迪杰斯特拉(Dijkstra)算法求解最短路問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

迪杰斯特拉(Dijkstra)算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的。是尋找從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,可用來(lái)解決最短路徑問(wèn)題。

迪杰斯特拉算法采用貪心算法的策略,將所有頂點(diǎn)分為已標(biāo)記點(diǎn)和未標(biāo)記點(diǎn)兩個(gè)集合,從起始點(diǎn)開(kāi)始,不斷在未標(biāo)記點(diǎn)中尋找距離起始點(diǎn)路徑最短的頂點(diǎn),并將其標(biāo)記,直到所有頂點(diǎn)都被標(biāo)記為止。需要注意的一點(diǎn)是該方法不能處理帶有負(fù)權(quán)邊的圖,下面我們舉出一個(gè)實(shí)例并通過(guò)迪杰斯特拉方法對(duì)其進(jìn)行求解。

圖1所示為一個(gè)最短路徑問(wèn)題,每條邊代表一條路徑,邊上的數(shù)值表示這條邊的長(zhǎng)度。

dijkstra,java,算法,圖論

我們用迪杰斯特拉方法尋找從頂點(diǎn)0到頂點(diǎn)5的最短路徑。標(biāo)號(hào)結(jié)果如圖2所示,圖中括號(hào)里的兩個(gè)數(shù)分別表示該點(diǎn)的父頂點(diǎn)標(biāo)號(hào)和初始點(diǎn)到該點(diǎn)的最短路徑長(zhǎng)度。由圖2可知,從節(jié)點(diǎn)0到節(jié)點(diǎn)5的最短路徑長(zhǎng)度為9,最短路徑為:0 -> 2 -> 3 -> 5。

dijkstra,java,算法,圖論

下面我們考慮通過(guò)java語(yǔ)言來(lái)實(shí)現(xiàn)用迪杰斯特拉算法尋找圖一中的頂點(diǎn)0到頂點(diǎn)5的最短路徑問(wèn)題。

我們首先創(chuàng)建一個(gè)頂點(diǎn)類(lèi),屬性包括id、父點(diǎn)和到起始點(diǎn)的最短距離。主方法主要分為五個(gè)部分,在第一部分進(jìn)行數(shù)據(jù)的初始化;第二個(gè)部分新建一個(gè)已標(biāo)記點(diǎn)集合,創(chuàng)建一個(gè)點(diǎn)對(duì)象作為起始頂點(diǎn)加入到已標(biāo)記點(diǎn)集合中;第二部分新建一個(gè)未標(biāo)記點(diǎn)集合,創(chuàng)建其余5個(gè)點(diǎn)并添加到未標(biāo)記點(diǎn)集合中;第三部分為一個(gè)while循環(huán),功能是不斷的將未標(biāo)記點(diǎn)集合中的點(diǎn)轉(zhuǎn)移到已標(biāo)記點(diǎn)集合中去;第五部分是路徑的輸出。在第四部分,每個(gè)循環(huán)中我們需要尋找要進(jìn)行標(biāo)記的頂點(diǎn),因此我們創(chuàng)建了一個(gè)尋找要標(biāo)記頂點(diǎn)的函數(shù),其功能是在所有未標(biāo)記點(diǎn)中尋找距離起始頂點(diǎn)距離最短的頂點(diǎn),具體過(guò)程如下:

初始時(shí),已標(biāo)記點(diǎn)集合中只有源節(jié)點(diǎn),未標(biāo)記點(diǎn)集合中包含剩余所有節(jié)點(diǎn)。隨后進(jìn)入迭代,每次迭代時(shí),首先探索從已標(biāo)記節(jié)點(diǎn)(如vi)流出的所有有向弧,找到流出弧的尾部節(jié)點(diǎn)(如vj),計(jì)算從vi到vj的費(fèi)用和收益以及到源節(jié)點(diǎn)的利潤(rùn)(vj到源節(jié)點(diǎn)的利潤(rùn)=vi到源節(jié)點(diǎn)的利潤(rùn)+vi到vj的利潤(rùn)),若該利潤(rùn)大于vj到源節(jié)點(diǎn)的最大利潤(rùn),將vj到源節(jié)點(diǎn)的最大利潤(rùn)更新為該利潤(rùn),將vi標(biāo)記為vj的上一個(gè)節(jié)點(diǎn)。未標(biāo)記點(diǎn)集合遍歷完成后,若節(jié)點(diǎn)vj滿足在所有未標(biāo)記點(diǎn)中到源節(jié)點(diǎn)的利潤(rùn)最大,將節(jié)點(diǎn)vj添加到已標(biāo)記點(diǎn)集合,并在未標(biāo)記點(diǎn)集合中刪除節(jié)點(diǎn)vj。

不斷重復(fù)上述操作,直至未標(biāo)記點(diǎn)集合為空集。迪杰斯特拉算法就是將所有頂點(diǎn)分為已標(biāo)記點(diǎn)和未標(biāo)記點(diǎn)兩個(gè)集合,從起始點(diǎn)開(kāi)始,不斷在未標(biāo)記點(diǎn)中尋找距離起始點(diǎn)利潤(rùn)最大的節(jié)點(diǎn),并將其標(biāo)記,直到所有頂點(diǎn)都被標(biāo)記為止。詳細(xì)代碼如下:

import java.util.ArrayList;
import java.util.List;

public class Dijkstra {

    static int[][] matrix = new int[6][6];
    final static int N = 10000;

    public static void main(String[] args) {

        //鄰接矩陣
        matrix[0] = new int[]{0, 6, 3, N, N, N};/*1*/
        matrix[1] = new int[]{6, 0, 2, 5, N, N};/*2*/
        matrix[2] = new int[]{3, 2, 0, 3, 4, N};/*3*/
        matrix[3] = new int[]{N, 5, 3, 0, 2, 3};/*4*/
        matrix[4] = new int[]{N, N, 4, 2, 0, 5};/*5*/
        matrix[5] = new int[]{N, N, N, 3, 5, 0};/*6*/

        //已標(biāo)記點(diǎn)集合
        List<Vertex> Marked = new ArrayList<>();
        Vertex vt0 = new Vertex();
        vt0.id = 0;
        vt0.minLenth = 0;
        Marked.add(vt0);

        //未標(biāo)記點(diǎn)集合
        List<Vertex> UnMarked = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Vertex vtx = new Vertex();
            vtx.id = i+1;
            UnMarked.add(vtx);
        }

        //將未標(biāo)記點(diǎn)集合中的點(diǎn)轉(zhuǎn)移到已標(biāo)記點(diǎn)集合
        int order = 1;
        while(!UnMarked.isEmpty()){
            Vertex vtx = FindVer(Marked, UnMarked);
            UnMarked.remove(vtx);
            Marked.add(vtx);
            System.out.println("第"+order+"次標(biāo)號(hào),頂點(diǎn)"+vtx.id+"的標(biāo)號(hào)為:(" + vtx.father.id + "," +vtx.minLenth + ")");
            order++;
        }

        //輸出路徑
        for(Vertex v :Marked){
            if(v.id == 5){
                System.out.println("0-5的最短路徑長(zhǎng)度為:" + v.minLenth);
                System.out.print("逆推得最優(yōu)路徑為:" + "5");
                while(v.id != 0){
                    v = v.father;
                    System.out.print( " -> " + v.id);
                }
            }
        } 
    }

    static Vertex FindVer(List<Vertex> Marked, List<Vertex> UnMarked){
        int M = 10000;
        Vertex v = null;
        for (Vertex ve : UnMarked) {
            for (Vertex vr : Marked) {
                int all_p = vr.minLenth + matrix[vr.id][ve.id];
                if (all_p <= ve.minLenth) {
                    ve.minLenth = all_p;
                    ve.father = vr;
                }
            }
            if (ve.minLenth < M) {
                M = ve.minLenth;
                v = ve;
            }
        }
        return v;
    }

}
class Vertex {
    public int id;
    public Vertex father;
    public int minLenth = 10000;
}

程序的運(yùn)行結(jié)果如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-533071.html

第1次標(biāo)號(hào),頂點(diǎn)2的標(biāo)號(hào)為:(0,3)
第2次標(biāo)號(hào),頂點(diǎn)1的標(biāo)號(hào)為:(2,5)
第3次標(biāo)號(hào),頂點(diǎn)3的標(biāo)號(hào)為:(2,6)
第4次標(biāo)號(hào),頂點(diǎn)4的標(biāo)號(hào)為:(2,7)
第5次標(biāo)號(hào),頂點(diǎn)5的標(biāo)號(hào)為:(3,9)
0-5的最短路徑長(zhǎng)度為:9
逆推得最優(yōu)路徑為:5 -> 3 -> 2 -> 0
進(jìn)程已結(jié)束,退出代碼0

到了這里,關(guān)于java實(shí)現(xiàn)迪杰斯特拉(Dijkstra)算法求解最短路問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)記錄——圖-最短路徑問(wèn)題(無(wú)權(quán)圖單源最短路徑算法、有權(quán)圖單源最短路徑算法、多源最短路徑算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)記錄——圖-最短路徑問(wèn)題(無(wú)權(quán)圖單源最短路徑算法、有權(quán)圖單源最短路徑算法、多源最短路徑算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目錄 問(wèn)題分類(lèi)? 無(wú)權(quán)圖單源最短路徑算法 思路 偽代碼 時(shí)間復(fù)雜度 代碼實(shí)現(xiàn)(C語(yǔ)言) 有權(quán)圖單源最短路徑算法 Dijkstra(迪杰斯特拉)算法 偽代碼? 時(shí)間復(fù)雜度? 代碼實(shí)現(xiàn)(C語(yǔ)言) 多源最短路徑算法 兩種方法 Floyd算法 代碼實(shí)現(xiàn)(C語(yǔ)言) 最短路徑問(wèn)題的抽象 在網(wǎng)絡(luò)中,求

    2024年02月08日
    瀏覽(21)
  • MATLAB輕松繪制地圖路線——Dijkstra(迪杰斯特拉)算法最短路徑規(guī)劃

    MATLAB輕松繪制地圖路線——Dijkstra(迪杰斯特拉)算法最短路徑規(guī)劃

    利用MATLAB繪制地圖需要三個(gè)基本數(shù)據(jù): 節(jié)點(diǎn) 節(jié)點(diǎn)坐標(biāo) 節(jié)點(diǎn)間相通的路線 以11B交通巡警平臺(tái)調(diào)度問(wèn)題中的A區(qū)數(shù)據(jù)為例: (數(shù)據(jù)及工程文件下載鏈接見(jiàn)文末) Demo1: 可通過(guò)已知節(jié)點(diǎn)的坐標(biāo),計(jì)算出各節(jié)點(diǎn)之間的距離,有Matlab基礎(chǔ)的同學(xué)可以嘗試Demo2, 也可通過(guò)Excel自行實(shí)現(xiàn);

    2023年04月21日
    瀏覽(23)
  • 使用omp并行技術(shù)加速最短路徑算法-迪杰斯特拉(Dijkstra)算法(記錄最短路徑和距離)

    使用omp并行技術(shù)加速最短路徑算法-迪杰斯特拉(Dijkstra)算法(記錄最短路徑和距離)

    原理: Dijkstra算法是解決**單源最短路徑**問(wèn)題的**貪心算法** 它先求出長(zhǎng)度最短的一條路徑,再參照該最短路徑求出長(zhǎng)度次短的一條路徑 ? ? 直到求出從源點(diǎn)到其他各個(gè)頂點(diǎn)的最短路徑。 首先假定源點(diǎn)為u,頂點(diǎn)集合V被劃分為兩部分:集合 S 和 V-S。 初始時(shí)S中僅含有源點(diǎn)u,

    2024年02月10日
    瀏覽(55)
  • 迪杰斯特拉(Dijkstra's )算法——解決帶權(quán)有向無(wú)向圖最短路徑

    迪杰斯特拉(Dijkstra's )算法——解決帶權(quán)有向無(wú)向圖最短路徑

    迪杰斯特拉算法(Dijkstra\\\'s Algorithm),又稱(chēng)為狄克斯特拉算法,是一種用于解決帶權(quán)重有向圖或無(wú)向圖最短路徑問(wèn)題的算法。該算法由荷蘭計(jì)算機(jī)科學(xué)家艾茲赫爾·狄克斯特拉在1956年發(fā)明,是一種廣泛應(yīng)用于網(wǎng)絡(luò)路由和其他領(lǐng)域的算法。 在 2001 年的一次采訪中,Dijkstra 博士透露

    2024年02月03日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】最小生成樹(shù)(Prim算法,普里姆算法,普利姆)、最短路徑(Dijkstra算法,迪杰斯特拉算法,單源最短路徑)

    【數(shù)據(jù)結(jié)構(gòu)】最小生成樹(shù)(Prim算法,普里姆算法,普利姆)、最短路徑(Dijkstra算法,迪杰斯特拉算法,單源最短路徑)

    問(wèn)題解答 (1)最小生成樹(shù)(Minimal Spanning Tree)的定義 生成樹(shù)的代價(jià) :設(shè) G ( V , E ) G(V,E) G ( V , E ) 是一個(gè)無(wú)向連通網(wǎng)圖,生成樹(shù)上 各邊的權(quán)值之和 稱(chēng)為 生成樹(shù)的代價(jià) 。 最小生成樹(shù) :在圖 G G G 所有生成樹(shù)中, 代價(jià)最小的生成樹(shù) 為 最小生成樹(shù) 。 (2)最小生成樹(shù)(MST)的性

    2024年02月11日
    瀏覽(53)
  • Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是廣度優(yōu)先搜索(BFS) 貪心策略。 是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,節(jié)點(diǎn)邊是不各自不同的權(quán)重,但都必須是正數(shù) 如果是負(fù)數(shù),則需要 Bellman-Ford 算法 如果想求任意兩點(diǎn)之間的距離,就需要用 Floyd 算法 求節(jié)點(diǎn)0 - 4 的最短路徑 每次從

    2024年04月12日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)--迪杰斯特拉(Dijkstra)算法

    數(shù)據(jù)結(jié)構(gòu)--迪杰斯特拉(Dijkstra)算法

    生活封鎖了我們,只要我們的心不死,生活便永遠(yuǎn)不是一汪死水,而我們,依然會(huì)綻放最美的姿態(tài)。 戴克斯特拉算法(英語(yǔ):Dijkstra’s algorithm),又稱(chēng)迪杰斯特拉算法、Dijkstra算法,是由荷蘭計(jì)算機(jī)科學(xué)家艾茲赫爾·戴克斯特拉在1956年發(fā)現(xiàn)的算法,并于3年后在期刊上發(fā)表。

    2024年02月04日
    瀏覽(26)
  • dijkstra迪杰斯特拉算法(鄰接表法)

    dijkstra迪杰斯特拉算法(鄰接表法)

    算法簡(jiǎn)易過(guò)程: 求單源有向圖最短路徑 使用 鄰接表法 來(lái)存儲(chǔ)頂點(diǎn)和邊,錄入 有向圖 。 (當(dāng)然也可以無(wú)向圖,不過(guò)錄入時(shí)要錄入兩次,比如 a b 3? ? ? ? b a 3) ?代碼如下: 測(cè)試如下: ?

    2024年02月07日
    瀏覽(33)
  • python實(shí)現(xiàn)Dijkstra算法求解最短路徑問(wèn)題(Shortest Path Problem)

    python實(shí)現(xiàn)Dijkstra算法求解最短路徑問(wèn)題(Shortest Path Problem)

    最短路問(wèn)題(Shortest Path Problem,SPP)是 圖論 的一個(gè)經(jīng)典問(wèn)題,其目的在于尋找網(wǎng)絡(luò)中任意兩個(gè)節(jié)點(diǎn)間的最短路徑,這里的最短可以衍生為距離最短、費(fèi)用最小、時(shí)間最短等一系列度量。當(dāng)前的涌現(xiàn)了很多最短路徑的變種,如帶資源約束的最短路徑問(wèn)題(Shortest Path Problem wit

    2024年02月09日
    瀏覽(22)
  • (迪杰斯特拉)Dijkstra算法及其優(yōu)化(C++)

    (迪杰斯特拉)Dijkstra算法及其優(yōu)化(C++)

    題目描述 給定一個(gè) n n n 個(gè)點(diǎn) m m m 條邊的有向圖,圖中可能存在重邊和自環(huán),所有邊權(quán)均為非負(fù)值。 請(qǐng)你求出 1 1 1 號(hào)點(diǎn)到 n n n 號(hào)點(diǎn)的最短距離,如果無(wú)法從 1 1 1 號(hào)點(diǎn)走到 n n n 號(hào)點(diǎn),則輸出 ? 1 ?1 ? 1 。 輸入格式 第一行包含整數(shù) n n n 和 m m m 。 接下來(lái) m m m 行每行包含三

    2023年04月09日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包