Bellman-Ford(貝爾曼福特算法)

簡介

貝爾曼-福特算法(Bellman-Ford Algorithm)是一種用于求解單源最短路徑問題的算法,它可以處理帶有負權邊的圖。 該算法的實現思路是通過不斷迭代松弛操作來更新最短路徑,直到找到最優解。

名詞解釋:
1. 松弛操作:不斷更新最短路徑和前驅結點的操作。
2. 負權回路:繞一圈繞回來發現到自己的距離從0變成了負數,到各結點的距離無限制的降低,停不下來

算法特點

  • 貝爾曼-福特算法可以處理帶有負權邊的圖,而迪杰斯特拉算法(Dijkstra's Algorithm)等其他最短路徑算法無法處理這種情況。
  • 貝爾曼-福特算法的實現相對簡單,易于理解和編程。
  • 貝爾曼-福特算法的時間復雜度為 O(nm),其中 n 是圖中頂點的個數,m 是圖中邊的個數。 這使得它在稀疏圖中效率較低。

如何理解貝爾曼-福特算法?

想象一下你正在一個城市中尋找最短路徑。 你可以從一個路口開始,沿著道路前進,并記錄下每個路口的距離。 貝爾曼-福特算法的工作方式類似:

  • 首先,將所有路口的距離設置為無窮大,并將起點距離設置為 0。

  • 然后,遍歷所有道路,并對每個路口進行以下操作:

    • 如果當前路口的距離加上該道路的長度小于該道路終點的距離,則將該道路終點的距離更新為當前路口的距離加上該道路的長度。
  • 重復上述步驟 n - 1 次,其中 n 是路口的數量。

通過不斷重復上述步驟,最終可以找到所有路口到起點的最短路徑。

代碼

void ford() {// 初始化距離數組,表示起點到每個頂點的距離為無窮大for (int i = 1; i <= n; i++) {dis[i] = INF;}dis[1] = 0; // 起點到自身的距離為0// 進行n-1次松弛操作for (int k = 1; k <= n - 1; k++) {for (int i = 1; i <= m; i++) {// 如果通過當前邊能夠使終點的距離更短,則更新距離if (dis[v[i]] > dis[u[i]] + w[i]) {dis[v[i]] = dis[u[i]] + w[i];}}}
}

如有不理解的可以上b站上看up主@簡楓葉

總結

Bellman算法的核心就是松馳,沒有貪心策略,也使它的時間復雜度比較高。因為它是單純的松馳。首先我們要明白的是:如果處于第n層的節點,在它上一層的即n-1層所以節點的dist已經確定為最終真實值,那么通過一次遍歷,第n層節點的dist也能被確定為最終真實值。第一次迭代,獲得的信息是:與源點相鄰點的真正dist(第二層節點),(其他點的可能仍為無窮大,或者為松馳一次狀態);第二次循環,因為第二層的信息已經完全掌握,此次迭代是能確定第三層節點(從源點出發,經過2條邊)的點的真實最短距離。(由于遍歷的過程中,只完全掌握了第一層,其他節點的dist不能完全確定為最終的dist);如此循環,遍歷n-1次,第n層的節點已經遍歷完,至此,所有節點的dist都最終確定了(解釋了為啥能求最短路)

例題P1629 郵遞員送信

?郵遞員送信

?題目描述

有一個郵遞員要送東西,郵局在節點 1。他總共要送 n-1?樣東西,其目的地分別是節點 2?到節點 n。由于這個城市的交通比較繁忙,因此所有的道路都是單行的,共有 m條道路。這個郵遞員每次只能帶一樣東西,并且運送每件物品過后必須返回郵局。求送完這 n-1?樣東西并且最終回到郵局最少需要的時間。

?輸入格式

第一行包括兩個整數,n?和 m,表示城市的節點數量和道路數量。

第二行到第 (m+1)?行,每行三個整數,u,v,w,表示從u?到 v?有一條通過時間為 w?的道路。

?輸出格式

輸出僅一行,包含一個整數,為最少需要的時間。

#include <stdio.h>#define INF 99999999 // 定義無窮大值
#define MAXN 1005 // 最大頂點數
#define MAXM 100005 // 最大邊數int n, m; // 頂點數和邊數
int u[MAXM], v[MAXM], w[MAXM]; // 邊的起點、終點、權值
int dis[MAXN]; // 存儲起點到各頂點的最短距離// 初始化函數,讀入頂點數、邊數以及每條邊的起點、終點、權值
void init() {scanf("%d %d", &n, &m); // 輸入頂點數n和邊數mfor (int i = 1; i <= m; i++) {scanf("%d %d %d", &u[i], &v[i], &w[i]); // 輸入每條邊的起點、終點、權值}
}// 反轉邊的起點和終點
void over() {for (int i = 1; i <= m; i++) {int temp = u[i];u[i] = v[i];v[i] = temp;}
}// Ford算法求解最短路徑
void ford() {// 初始化距離數組,表示起點到每個頂點的距離為無窮大for (int i = 1; i <= n; i++) {dis[i] = INF;}dis[1] = 0; // 起點到自身的距離為0// 進行n-1次松弛操作for (int k = 1; k <= n - 1; k++) {for (int i = 1; i <= m; i++) {// 如果通過當前邊能夠使終點的距離更短,則更新距離if (dis[v[i]] > dis[u[i]] + w[i]) {dis[v[i]] = dis[u[i]] + w[i];}}}
}int main() {init(); // 初始化int ans = 0; // 記錄總距離ford(); // 調用Ford算法計算從起點到各頂點的最短距離for (int i = 1; i <= n; i++) {ans += dis[i]; // 累加起點到各頂點的最短距離}over(); // 反轉邊的起點和終點ford(); // 重新計算最短路徑for (int i = 1; i <= n; i++) {ans += dis[i]; // 累加起點到各頂點的最短距離}printf("%d\n", ans); // 輸出總距離return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt 獲取控件尺寸與實際不一致的問題

前提&#xff1a;界面ui獲取桌面大小&#xff0c;用resize() 重新調整了界面尺寸 然后 我獲取界面上某個控件大小時&#xff0c;發現與實際尺寸不一樣。 最后發現&#xff1a; 獲取控件大小的地方&#xff0c;必須在界面show()之后才可以&#xff0c;放之前不行。 注意; 經…

WPF 控件禁用時,顯示懸浮提示

WPF 控件禁用時&#xff0c;顯示懸浮提示 控件在禁用狀態下&#xff0c;按鈕是沒有懸浮提示信息的&#xff0c;是事件觸發的機制&#xff1b; 如果要禁用下也有懸浮提示&#xff0c;可以在控件外面加一層&#xff0c;例如&#xff1a; <Border Grid.Column"1" To…

Hive【內部表、外部表、臨時表、分區表、分桶表】【總結】

目錄 Hive的物種表結構特性 一、內部表 建表 使用場景 二、外部表 建表:關鍵詞【EXTERNAL】 場景&#xff1a; 外部表與內部表可互相轉換 三、臨時表 建表 臨時表橫向對比?編輯 四、分區表 建表&#xff1a;關鍵字【PARTITIONED BY】 場景&#xff1a; 五、分桶表 …

CentOS 7.x 使用 RPM 包安裝 Gitlab

官網&#xff1a;https://about.gitlab.com/ https://about.gitlab.cn/install/ 安裝&#xff1a;https://gitlab.cn/install/ 博客&#xff1a;https://gitlab.cn/blog/ 文檔&#xff1a;https://docs.gitlab.com/ https://about.gitlab.com/install/#centos-7 https://docs.g…

工作記錄vue3 echarts地圖等 監聽瀏覽器等寫法

子組件<template><div><div>【云端報警風險】</div><div ref"target" class"w-full h-full"></div></div> </template><script setup> import { ref, onMounted,watch } from vue; import * as ech…

算能RISC-V通用云開發空間編譯pytorch @openKylin留檔

終于可以體驗下risc-v了&#xff01; 操作系統是openKylin&#xff0c;算能的云空間 嘗試編譯安裝pytorch 首先安裝git apt install git 然后下載pytorch和算能cpu的庫&#xff1a; git clone https://github.com/sophgo/cpuinfo.git git clone https://github.com/pytorc…

小米14 Ultra:未來科技的集大成者

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

opencv圖像的本質

目的 OpenCV是一個跨平臺的庫&#xff0c;使用它我們可以開發實時的計算機視覺應用程序。 它主要集中在圖像處理&#xff0c;視頻采集和分析&#xff0c;包括人臉檢測和物體檢測等功能。 數字圖像在計算機中是以矩陣形式存儲的&#xff0c;矩陣中的每一個元素都描述一定的圖像…

VSCode React JavaScript Snippets 插件的安裝與使用指南

VSCode React JavaScript Snippets 插件的安裝與使用指南 在開發 React 項目時&#xff0c;提高效率是每個開發者都追求的目標之一。VSCode React JavaScript Snippets 插件就是為了提升 React 開發效率而設計的&#xff0c;它為常用的 React 代碼片段提供了快捷鍵&#xff0c;…

NXP實戰筆記(六):S32K3xx基于RTD-SDK在S32DS上配置PWM發波

目錄 1、概述 2、SDK配置 2.1、Port配置 2.2、Emios_Mcl_Ip 2.3、Emios_Pwm 2.4、代碼示例 1、概述 針對S32K3xx芯片&#xff0c;產生PWM的硬件支持單元僅有兩個&#xff0c;分別是eMiosx與Flexio. 生成PWM的順序&#xff0c;按照單片機所用資源進行初始化執行如下 初始化…

去年面試的運維開發面試題二

VPN有哪些協議&#xff0c;不同協議之間有何區別&#xff1f; 2.內部組網通常使用哪些類型的網段&#xff0c;兩個不同網段如何通信&#xff1f; 3.Linux中絕對路徑&#xff0c;相對路徑的區別 4. Linux如何添加磁盤&#xff0c;擴容系統文件&#xff1f; 5. Linux如何查看進程…

原型模式(Prototype Pattern) C++

上一節&#xff1a;建造者模式&#xff08;Builder Pattern&#xff09;C 文章目錄 0.理論1.原型模式的核心組成&#xff1a;2.實現方法3.什么時候使用 1.實踐步驟 1: 定義怪物原型步驟 2: 實現具體怪物原型步驟 3: 使用原型創建怪物 0.理論 原型模式&#xff08;Prototype P…

7-liunx服務器規范

目錄 概況liunx日志liunx系統日志syslog函數openlog 可以改變syslog默認輸出方式 &#xff0c;進一步結構化 用戶信息進程間的關系會話ps命令查看進程關系 系統資源限制改變工作目錄和根目錄服務器程序后臺話 概況 liunx服務器上有很多細節需要注意 &#xff0c;這些細節很重要…

服務網格Service Mesh和Istio

文章目錄 服務網格&#xff08;Service Mesh&#xff09;市場上三種服務網格解決方案服務網格的特征流量管理安全性可觀察性 Istio簡介Istio提供了什么功能服務 &#xff1f;Istio 核心特性流量管理安全可觀察性 平臺支持 服務網格&#xff08;Service Mesh&#xff09; 服務網…

Eureka注冊中心(黑馬學習筆記)

Eureka注冊中心 假如我們的服務提供者user-service部署了多個實例&#xff0c;如圖&#xff1a; 大家思考幾個問題&#xff1a; order-service在發起遠程調用的時候&#xff0c;該如何得知user-service實例的ip地址和端口&#xff1f; 有多個user-service實例地址&#xff0c…

六、行列式基本知識

目錄 1、行列式的特性 2、行列式的計算方法: 2.1 通過行列式的定義去計算:對角法則。 2. 2 利用行列式的性質將行列式轉化為上三角行列式: ①行列式的性質 : 性質一: 性質二: 性質三: 性質四:行列式之間的加法

TreeData 數據查找

TreeData 數據查找 最近做需求的時候遇到了這樣的一個需求&#xff0c;Tree組件數據支持查找&#xff0c;而且TreeData的數據層級是無限級的 開始想的事借助UI組件庫&#xff08;Ant-design-vue&#xff09;中的Tree組件的相關方法直接實現,看了下api 發現沒法實現&#xff0c;…

超級實用的python代碼片段匯總和詳細解析(16個)

目錄 1. 生成隨機文本 2. 計算文本文件中的字數 3. 替換文件文件中的字串 4. 多文件名的批量替換 5. 從網站提取數據 6. 批量下載圖片 7.批量刪除空文件夾 8.Excel表格讀寫 9.合并Excel表格工作簿 10.數據庫SQL查詢 11. 系統進程查殺 12.圖像尺寸調整和裁剪 13.圖…

redis實現消息隊列redis發布訂閱redis監聽key

文章目錄 Redis消息隊列實現異步秒殺1. jvm阻塞隊列問題2. 什么是消息隊列3. Redis實現消息隊列1. 基于List結構模擬消息隊列操作優缺點 2. 基于PubSub發布訂閱的消息隊列操作優缺點spring 結合redis的pubsub使用示例1. 引入依賴2. 配置文件3. RedisConfig4. CustomizeMessageL…

大語言模型的開山之作—探秘GPT系列:GPT-1-GPT2-GPT-3的進化之路

模型模型參數創新點評價GPT1預訓練微調&#xff0c; 創新點在于Task-specific input transformations。GPT215億參數預訓練PromptPredict&#xff0c; 創新點在于Zero-shotZero-shot新穎度拉滿&#xff0c;但模型性能拉胯GPT31750億參數預訓練PromptPredict&#xff0c; 創新點…