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

關(guān)于弗洛伊德算法求最短路徑詳解

 更新時(shí)間:2023年07月14日 09:13:04   作者:M??? ??.  
這篇文章主要介紹了關(guān)于弗洛伊德算法求最短路徑詳解,弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通過(guò)選定的被訪問(wèn)頂點(diǎn),求出從出發(fā)訪問(wèn)頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑:弗洛伊德算法中每-個(gè)頂點(diǎn)都是出發(fā)訪問(wèn)點(diǎn),需要的朋友可以參考下

弗洛伊德算法介紹

  • 和迪杰斯特拉算法一 樣, 弗洛伊德(Floyd)算法也是一種用于尋找給定的加權(quán)圖中頂點(diǎn)間最短路徑的算法。
  • 弗洛伊德算法(Floyd)計(jì)算圖中各個(gè)頂點(diǎn)之間的最短路徑
  • 迪杰斯特拉算法用于計(jì)算圖中某-一個(gè)頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑。
  • 弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通過(guò)選定的被訪問(wèn)頂點(diǎn),求出從出發(fā)訪問(wèn)頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑:弗洛伊德算法中每-個(gè)頂點(diǎn)都是出發(fā)訪問(wèn)點(diǎn),所以需要將每-一個(gè)頂點(diǎn)看做被訪問(wèn)頂點(diǎn),求出從每一個(gè)頂點(diǎn)到其他頂點(diǎn)的最短路徑。
  • 算法的時(shí)間復(fù)雜度為O(N3),空間復(fù)雜度為O(N2)。
  • 優(yōu)點(diǎn):容易理解,可以算出任意兩個(gè)節(jié)點(diǎn)之間的最短距離,代碼編寫簡(jiǎn)單。
  • 缺點(diǎn):時(shí)間復(fù)雜度比較高,不適合計(jì)算大量數(shù)據(jù)。

弗洛伊德算法思想

通過(guò)一個(gè)圖的權(quán)值矩陣求出它的每?jī)牲c(diǎn)間的最短路徑矩陣。

從圖的帶權(quán)鄰接矩陣A=[a(i,j)] n×n開(kāi)始,遞歸地進(jìn)行n次更新,即由矩陣D(0)=A,按一個(gè)公式,構(gòu)造出矩陣D(1);又用同樣地公式由D(1)構(gòu)造出D(2);……;

最后又用同樣的公式由D(n-1)構(gòu)造出矩陣D(n)。矩陣D(n)的i行j列元素便是i號(hào)頂點(diǎn)到j(luò)號(hào)頂點(diǎn)的最短路徑長(zhǎng)度,稱D(n)為圖的距離矩陣

同時(shí)還可引入一個(gè)后繼節(jié)點(diǎn)矩陣path來(lái)記錄兩點(diǎn)間的最短路徑。

采用的是(松弛技術(shù)),對(duì)在i和j之間的所有其他點(diǎn)進(jìn)行一次松弛。所以時(shí)間復(fù)雜度為O(n^3);

其狀態(tài)轉(zhuǎn)移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}

map[i,j]表示i到j(luò)的最短距離,K是窮舉i,j的斷點(diǎn),map[n,n]初值應(yīng)該為0.當(dāng)然,如果這條路沒(méi)有通的話,還必須特殊處理,比如沒(méi)有map[i,k]這條路

算法原理

Floyd算法的原理是動(dòng)態(tài)規(guī)劃。

設(shè)Di,j,k為從i到j(luò)的只以(1…k)集合中的節(jié)點(diǎn)為中間節(jié)點(diǎn)的最短路徑的長(zhǎng)度。

代碼實(shí)現(xiàn):

public class Test1 {
    public static void main(String[] args) {
        System.out.println("請(qǐng)輸入有幾個(gè)頂點(diǎn):");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        char[] vertex = new char[n];
        System.out.println("請(qǐng)輸入各個(gè)頂點(diǎn)的符號(hào),每個(gè)字符用空格分隔:");
        for (int i = 0; i < n; i++) {
            vertex[i] = scanner.next().charAt(0);
        }
        int[][] arr = new int[n][n];
        System.out.println("請(qǐng)輸入各個(gè)頂點(diǎn)在二維表之間的距離,不能直達(dá)的用100表示:");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = scanner.nextInt();
            }
        }
        Graph gp = new Graph(vertex, arr, n);
        gp.floyd();
        gp.show(vertex);
    }
}
//創(chuàng)建圖
class Graph {
    private char[] vertex;
    private int[][] dis; // 從頂點(diǎn)出發(fā)到其他節(jié)點(diǎn)的距離
    private int[][] pre; // 目標(biāo)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
    // 頂點(diǎn)數(shù)組 鄰接矩陣 長(zhǎng)度大小
    public Graph(char[] vertex, int[][] dis, int len) {
        this.vertex = vertex;
        this.dis = dis;
        this.pre = new int[len][len];
        // 對(duì)pre數(shù)組進(jìn)行初始化
        for (int i = 0; i < len; i++) {
            Arrays.fill(pre[i], i);
        }
    }
    public void show(char[] vertex) {
        for (int i = 0; i < dis.length; i++) {
            for (int j = 0; j < dis.length; j++) {
                System.out.print(vertex[pre[i][j]] + "  ");
            }
            System.out.println();
            for (int j = 0; j < dis.length; j++) {
                System.out.print("( " + vertex[i] + " -> " + vertex[j] + " 的最短路徑 " + dis[i][j] + " )    ");
            }
            System.out.println();
        }
    }
    // 弗洛伊德算法
    public void floyd() {
        int len = 0;
        // 從中間節(jié)點(diǎn)進(jìn)行遍歷
        for (int k = 0; k < dis.length; k++) {
            // 對(duì)出發(fā)節(jié)點(diǎn)進(jìn)行遍歷
            for (int i = 0; i < dis.length; i++) {
                // 遍歷終點(diǎn)節(jié)點(diǎn)
                for (int j = 0; j < dis.length; j++) {
                    len = dis[i][k] + dis[k][j];
                    if (len < dis[i][j]) {
                        dis[i][j] = len;
                        pre[i][j] = pre[k][j];
                    }
                }
            }
        }
    }
}

結(jié)果展示:

示例1:

結(jié)果:

 示例2:

 結(jié)果:

到此這篇關(guān)于關(guān)于弗洛伊德算法求最短路徑詳解的文章就介紹到這了,更多相關(guān)弗洛伊德算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JWT Token實(shí)現(xiàn)方法及步驟詳解

    JWT Token實(shí)現(xiàn)方法及步驟詳解

    這篇文章主要介紹了JWT Token實(shí)現(xiàn)方法及步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring及Mybatis整合占位符解析失敗問(wèn)題解決

    Spring及Mybatis整合占位符解析失敗問(wèn)題解決

    這篇文章主要介紹了Spring及Mybatis整合占位符解析失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 利用Java獲取文件名、類名、方法名和行號(hào)的方法小結(jié)

    利用Java獲取文件名、類名、方法名和行號(hào)的方法小結(jié)

    這篇文章運(yùn)用實(shí)例代碼給大家介紹了利用Java怎樣獲取文件名、類名、方法名和行號(hào),有需要的可以參考借鑒,下面一起來(lái)看看吧。
    2016-08-08
  • 深入講解Java Maven配置

    深入講解Java Maven配置

    這篇文章主要介紹了Maven的安裝配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • java調(diào)用7zip解壓壓縮包的實(shí)例

    java調(diào)用7zip解壓壓縮包的實(shí)例

    下面小編就為大家?guī)?lái)一篇java調(diào)用7zip解壓壓縮包的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Java二進(jìn)制操作(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java二進(jìn)制操作(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    這篇文章給大家介紹了java二進(jìn)制操作技巧,包括移位、位運(yùn)算操作符等相關(guān)知識(shí)點(diǎn),非常不錯(cuò),感興趣的朋友參考下吧
    2017-03-03
  • Java實(shí)現(xiàn)PIFrame窗體效果的示例代碼

    Java實(shí)現(xiàn)PIFrame窗體效果的示例代碼

    在很多現(xiàn)代應(yīng)用中,常常需要使用個(gè)性化的窗體外觀,擺脫傳統(tǒng)窗口邊框的限制,無(wú)邊框、透明、圓角和陰影效果使得窗體顯得更輕巧、更具視覺(jué)吸引力,同時(shí)允許用戶自由拖拽和??看绑w,所以本文給大家介紹了如何使用Java實(shí)現(xiàn)PIFrame窗體效果,需要的朋友可以參考下
    2025-03-03
  • 徹底理解Spring注解@Autowired實(shí)現(xiàn)原理

    徹底理解Spring注解@Autowired實(shí)現(xiàn)原理

    這篇文章主要為大家詳細(xì)的介紹了Spring注解@Autowired實(shí)現(xiàn)的原理,縝密的邏輯分析,實(shí)踐應(yīng)用示例操作說(shuō)明,讓大家徹底的理解Spring注解@Autowired背后實(shí)現(xiàn)原理
    2022-03-03
  • Java-lambda表達(dá)式入門看這一篇就夠了

    Java-lambda表達(dá)式入門看這一篇就夠了

    lambda表達(dá)式最簡(jiǎn)單的作用就是用于簡(jiǎn)化創(chuàng)建匿名內(nèi)部類對(duì)象,Lambda表達(dá)式是一個(gè)可傳遞的代碼塊,可以在以后執(zhí)行一次或多次,下面通過(guò)本文給大家介紹Java-lambda表達(dá)式入門教程,感興趣的朋友一起看看吧
    2021-05-05
  • SpringBoot使用SSE進(jìn)行實(shí)時(shí)通知前端的實(shí)現(xiàn)代碼

    SpringBoot使用SSE進(jìn)行實(shí)時(shí)通知前端的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot使用SSE進(jìn)行實(shí)時(shí)通知前端,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

浦江县| 武宁县| 高碑店市| 巴彦淖尔市| 韶山市| 湘潭市| 梁平县| 汾西县| 镇坪县| 开江县| 开鲁县| 多伦县| 岳阳市| 宜春市| 汶川县| 平昌县| 丹巴县| 广东省| 舟曲县| 宁夏| 上高县| 长丰县| 河源市| 平阴县| 安庆市| 额济纳旗| 肇州县| 公主岭市| 文登市| 漯河市| 辽中县| 南部县| 南平市| 湾仔区| 长葛市| 锡林浩特市| 武川县| 绵阳市| 云安县| 天长市| 乌拉特后旗|