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

詳解Java Bellman-Ford算法原理及實現(xiàn)

 更新時間:2022年07月09日 15:51:42   作者:chengqiuming  
Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎(chǔ),Bellman-Ford算法是對所有邊都進(jìn)行松弛操作,本文將詳解Bellman-Ford算法原理及實現(xiàn),感興趣的可以了解一下

一 點睛

如果遇到負(fù)權(quán)邊,則在沒有負(fù)環(huán)(回路的權(quán)值之和為負(fù))存在時,可以采用 Bellman-Ford 算法求解最短路徑。該算法的優(yōu)點是變的權(quán)值可以是負(fù)數(shù)、實現(xiàn)簡單,缺點是時間復(fù)雜度過高。但是該算法可以進(jìn)行若干種優(yōu)化,以提高效率。

Bellman-Ford 算法與 Dijkstra 算法類似,都是以松弛操作作為基礎(chǔ)。Dijkstra 算法以貪心法選取未被處理的具有最小權(quán)值的節(jié)點,然后對其進(jìn)行松弛操作;而 Bellman-Ford 算法對所有邊都進(jìn)行松弛操作,共 n-1 次。因為負(fù)環(huán)可以無限制地減少最短路徑長度,所以吐過發(fā)現(xiàn)第 n 次操作仍然可松弛,則一定存在負(fù)環(huán)。Bellman-Ford 算法最長運行時間為O(nm),其中 n 和 m 分別是節(jié)點數(shù)和邊數(shù)。

二 算法步驟

1 數(shù)據(jù)結(jié)構(gòu)

因為需要利用邊進(jìn)行松弛,因此采用邊集數(shù)組存儲。每條邊都有三個域:兩個端點a和b,以及邊權(quán)w

2 松弛操作

對所有的邊 j(a,b,w),如果 dis[e[j]b]>dis[e[j].a]+e[j].w,則松弛,另 dis[e[j]b]=dis[e[j].a]+e[j].w。其中,dis[v] 表示從源點到節(jié)點 v 的最短路徑長度。

3 重復(fù)松弛操作 n-1 次

4 負(fù)環(huán)判斷

再執(zhí)行一次松弛操作,如果仍然可以松弛,則說明右負(fù)環(huán)。

三 算法實現(xiàn)

package graph.bellmanford;
 
import java.util.Scanner;
 
public class BellmanFord {
    static node e[] = new node[210];
    static int dis[] = new int[110];
    static int n;
    static int m;
    static int cnt = 0;
 
    static {
        for (int i = 0; i < e.length; i++) {
            e[i] = new node();
        }
    }
 
    static void add(int a, int b, int w) {
        e[cnt].a = a;
        e[cnt].b = b;
        e[cnt++].w = w;
    }
 
    static boolean bellman_ford(int u) { // 求源點 u 到其它頂點的最短路徑長度,判負(fù)環(huán)
        for (int i = 0; i < dis.length; i++) {
            dis[i] = 0x3f;
        }
        dis[u] = 0;
        for (int i = 1; i < n; i++) { // 執(zhí)行 n-1 次
            boolean flag = false;
            for (int j = 0; j < m; j++) // 邊數(shù) m 或 cnt
                if (dis[e[j].b] > dis[e[j].a] + e[j].w) {
                    dis[e[j].b] = dis[e[j].a] + e[j].w;
                    flag = true;
                }
            if (!flag)
                return false;
        }
        for (int j = 0; j < m; j++) // 再執(zhí)行 1 次,還能松弛說明有環(huán)
            if (dis[e[j].b] > dis[e[j].a] + e[j].w)
                return true;
        return false;
    }
 
 
    static void print() { // 輸出源點到其它節(jié)點的最短距離
        System.out.println("最短距離:");
        for (int i = 1; i <= n; i++)
            System.out.print(dis[i] + " ");
        System.out.println();
    }
 
    public static void main(String[] args) {
        int a, b, w;
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            a = scanner.nextInt();
            b = scanner.nextInt();
            w = scanner.nextInt();
            add(a, b, w);
        }
        if (bellman_ford(1)) // 判斷負(fù)環(huán)
            System.out.println("有負(fù)環(huán)!");
        else
            print();
    }
}
 
class node {
    int a;
    int b;
    int w;
}

四 測試

1 沒有負(fù)環(huán)的測試

2 有負(fù)環(huán)的測試

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

相關(guān)文章

  • java實現(xiàn)微信支付功能

    java實現(xiàn)微信支付功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)微信支付功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能的實現(xiàn)過程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法

    dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法

    多模塊和分布式開發(fā)一般都是有專門的的dependencies來進(jìn)行jar包的版本依賴問題,本文主要介紹了dependencies導(dǎo)致的Maven依賴出錯包紅問題解決方法,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • java8 LocalDate LocalDateTime等時間類用法實例分析

    java8 LocalDate LocalDateTime等時間類用法實例分析

    這篇文章主要介紹了java8 LocalDate LocalDateTime等時間類用法,結(jié)合具體實例形式分析了LocalDate、LocalTime、LocalDateTime等日期時間相關(guān)類的功能與具體使用技巧,需要的朋友可以參考下
    2017-04-04
  • SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    這篇文章主要介紹了SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    這篇文章主要介紹了如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Mybatis攔截器實現(xiàn)數(shù)據(jù)分表

    Mybatis攔截器實現(xiàn)數(shù)據(jù)分表

    當(dāng)數(shù)據(jù)量比較多時,放在一個表中的時候會影響查詢效率,本文主要介紹了Mybatis攔截器實現(xiàn)數(shù)據(jù)分表,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • JVM虛擬機的執(zhí)行流程解析

    JVM虛擬機的執(zhí)行流程解析

    這篇文章主要介紹了JVM虛擬機的執(zhí)行流程圖解,Java虛擬機的啟動是通過引導(dǎo)類加載器創(chuàng)建一個初始類來完成的,這個類是由虛擬機的具體實現(xiàn)指定的,程序開始執(zhí)行時他才運行,程序結(jié)束時他就停止,需要的朋友可以參考下
    2023-08-08
  • Spring boot實現(xiàn)數(shù)據(jù)庫讀寫分離的方法

    Spring boot實現(xiàn)數(shù)據(jù)庫讀寫分離的方法

    本篇文章主要介紹了Spring boot實現(xiàn)數(shù)據(jù)庫讀寫分離的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java實現(xiàn)向數(shù)組里添加元素

    Java實現(xiàn)向數(shù)組里添加元素

    這篇文章主要介紹了Java實現(xiàn)向數(shù)組里添加元素方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

巴彦淖尔市| 长岭县| 仙游县| 荔浦县| 万安县| 磴口县| 洞口县| 碌曲县| 阳泉市| 泉州市| 贵州省| 大兴区| 耒阳市| 怀集县| 叶城县| 广平县| 象山县| 上林县| 叙永县| 阆中市| 姚安县| 新营市| 图木舒克市| 汤原县| 乐安县| 明光市| 嘉定区| 微博| 桦甸市| 西华县| 泉州市| 额济纳旗| 思南县| 来宾市| 将乐县| 新民市| 紫云| 涪陵区| 都昌县| 开鲁县| 淳化县|