Bellman-Ford算法

初步了解

Bellman-Ford算法是一種用于尋找帶有負權邊的圖中的單源最短路徑的算法。它可以處理一般的圖,包括存在負權邊和負權環的情況。

以下是Bellman-Ford算法的基本思想和步驟:

  • 初始化:將源節點的距離設置為0,將所有其他節點的距離設置為無窮大(或一個很大的數)。

  • 進行松弛操作:對圖中的每條邊進行一輪松弛操作。松弛操作是指通過檢查是否存在一條更短路徑來更新節點的距離值。

  • 重復進行步驟2:重復進行|V|-1次松弛操作,其中|V|是圖中節點的數量。這是為了確保所有可能的最短路徑都被考慮到。

  • 檢測負權環:如果在進行第|V|-1次松弛操作后,仍然存在可以被進一步松弛的邊,那么說明圖中存在負權環。在這種情況下,Bellman-Ford算法無法得出正確的最短路徑。

  • 輸出結果:如果不存在負權環,則最終的距離值就是源節點到每個節點的最短路徑長度。

Bellman-Ford算法的時間復雜度為O(|V| * |E|),其中|V|是節點數,|E|是邊數。它可以處理負權邊,但是在圖中存在負權環的情況下,算法將無法收斂。

負權環是指在圖中存在一個環路,其中環路上的邊的權重之和為負值。換句話說,如果從起點沿著環路走一圈回到起點,所經過的邊的權重之和是負數。
在最短路徑算法中,負權環是一個問題,因為它會導致無限循環的情況。當存在負權環時,最短路徑就沒有意義,因為可以通過無限次地繞著負權環來獲得更小的路徑長度。
猜想一下,如果一個回路下來權值是一個負值,那么多繞幾圈權值越來越小,這樣就不存在最短路徑

注意了解為什么經過|V| - 1 次操作后仍然可以被進一步松弛的邊那么說明圖中存在負權環?
在一個沒有負權環的圖中,最短路徑的長度最多包含|V|-1條邊。而當存在負權環時,路徑可以無限地繞著負權環循環,從而使路徑的長度無限減小。

正式了解

我們來看看代碼實現

#include <iostream>
#include <vector>
#include <limits>struct Edge {int source;int destination;int weight;
};void BellmanFord(const std::vector<Edge>& edges, int numVertices, int source) {std::vector<int> distance(numVertices, std::numeric_limits<int>::max());std::vector<int> predecessor(numVertices, -1);distance[source] = 0;// 進行|V|-1次松弛操作for (int i = 1; i <= numVertices - 1; ++i) {for (const auto& edge : edges) {if (distance[edge.source] != std::numeric_limits<int>::max() &&distance[edge.source] + edge.weight < distance[edge.destination]) {distance[edge.destination] = distance[edge.source] + edge.weight;predecessor[edge.destination] = edge.source;}}}// 檢測負權環for (const auto& edge : edges) {if (distance[edge.source] != std::numeric_limits<int>::max() &&distance[edge.source] + edge.weight < distance[edge.destination]) {std::cout << "圖中存在負權環" << std::endl;return;}}// 輸出最短路徑std::cout << "節點\t距離\t路徑" << std::endl;for (int i = 0; i < numVertices; ++i) {std::cout << i << "\t" << distance[i] << "\t";std::vector<int> path;int current = i;while (current != source) {path.push_back(current);current = predecessor[current];}path.push_back(source);for (int j = path.size() - 1; j >= 0; --j) {std::cout << path[j] << " ";}std::cout << std::endl;}
}int main() {int numVertices = 5;std::vector<Edge> edges = {{0, 1, -1},{0, 2, 4},{1, 2, 3},{1, 3, 2},{1, 4, 2},{3, 2, 5},{3, 1, 1},{4, 3, -3}};int source = 0;BellmanFord(edges, numVertices, source);return 0;
}

代碼還是比較好理解的

當實現 Bellman-Ford 算法時,我們的目標是計算從給定源節點到圖中所有其他節點的最短路徑。下面是代碼實現的總體思路:

定義一個結構體 Edge 來表示圖的邊。它包含三個屬性:源節點 source、目標節點 destination 和邊的權重 weight。

BellmanFord 函數接受邊的列表 edges、節點數量 numVertices 和源節點 source 作為輸入參數。

初始化兩個數組:distance 和 predecessor,分別用于存儲從源節點到每個節點的距離和前驅節點。

將 distance 數組中除了源節點之外的所有元素初始化為無窮大,表示初始狀態下到達這些節點的距離都是無窮大。將 predecessor 數組中所有元素初始化為 -1,表示初始狀態下這些節點沒有前驅節點。

進行 numVertices - 1 次松弛操作。每次循環遍歷邊的列表,對每條邊進行松弛操作。如果發現從源節點出發經過當前邊到達目標節點的路徑比已知的最短路徑更短,則更新 distance 數組和 predecessor 數組。

完成 numVertices - 1 次松弛操作后,檢查是否存在負權環。遍歷邊的列表,再次進行一次松弛操作。如果發現存在從源節點出發經過當前邊到達目標節點的路徑比已知的最短路徑更短,則說明圖中存在負權環。

最后,輸出最短路徑的結果。遍歷每個節點,打印節點的索引、從源節點到該節點的最短距離以及完整的最短路徑。使用 predecessor 數組回溯每個節點的前驅節點,構建完整的路徑。

這個實現思路遵循了 Bellman-Ford 算法的基本步驟,首先進行多次松弛操作以計算最短路徑,然后檢測負權環來判斷是否存在無限縮小路徑的可能性。最后,通過回溯前驅節點來構建最短路徑。

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

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

相關文章

Hook+jsdom 解決cookie逆向

前言 記錄下如何破cookie逆向 目標 目標網址:https://q.10jqka.com.cn/ 目標接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 對抗:cookie反爬蟲處理,關鍵字v,如圖 解決步驟 1、JS中關鍵字查找 如上,我們找到了關鍵字 v,…

為何設計師都在用這個原型樣機資源網站?

談論原型樣機素材模板&#xff0c;這個話題對設計師來說如同老朋友一般熟悉。設計師們在創作完畢后&#xff0c;為了更淋漓盡致地展示他們的設計成果&#xff0c;通常會將其放置在真實的樣機素材模板中。這種原型樣機素材可以讓設計作品迅速且清晰地呈現在真實環境中。找到一個…

(5秒解決)ImportError: attempted relative import with no known parent package

尋找了很多方法&#xff0c;發現大家把事情講的復雜了。我這里用最簡單的辦法來解決父包引用找不到的問題。 報錯提示&#xff1a;ImportError: attempted relative import with no known parent package 先給大家看看我的目錄結構&#xff0c;model.py和test目錄在同一級。tra…

前端數組方法匯總集錦

前言 數組主要使用場景有&#xff1a; 存儲和處理數據&#xff1a;數組是一種有序的數據結構&#xff0c;可以用來存儲和處理多個相關的數據。在前端開發中&#xff0c;我們經常使用數組來存儲和處理列表、表格、選項等數據。 循環和遍歷&#xff1a;數組提供了循環和遍歷的功能…

Android12:內置第三方應用,權限控制器已停止運行,應用app已停止運行

1.設備先安裝我提供的app【EasyControler】 2.設備--設置--關于手機--版本號(滑動到最下方)---連續點擊六下打開 開發者模式 3.設置--系統--開發者模式--開發者選項 --打開usb調試 4.設置--安全設備管理應用--easycontrol的開關打開 5.將設備連接電腦 打開cmd命令框 輸入指令…

smartsofthelp 7.0 最簡單的代碼生成器

這是一款值得開發人員認真研究的軟件 https://pan.baidu.com/s/1xjDL5QypcRJ5neulUPFmWQ?pwdgedx 1.查詢數據庫死鎖相關信息 2.查看數據庫的鏈接情況 3.當前實例上的所有用戶 4.創建數據庫獨立密碼 5.查看數據庫使用的端口號 6.當前數據庫設置的最大連接數 7.當前數據庫最大的…

C語言運算符優先級表

C語言運算符優先級表 運算符優先級與結合性 優先級運算符描述結合性1&#xff0c;--后綴自增&#xff0c;自減從左往右()函數調用[]數組下標.結構體與聯合體訪問成員->結構體與聯合體通過指針訪問成員(type){list}復合字面量(C99)2&#xff0c;--前綴自增&#xff0c;自減從…

淡入淡出transition: right 1s

transition: right 1s; //重點直接改變right值 操作過快 這里用該方法實現1s內淡入淡出 達到效果目標

JS PromiseLike 的判定與使用

目錄 一. $.ajax()返回值遇到的問題二. Promise A 規范三. 判斷是否為PromiseLike3.1 判斷ES6的new Promise()3.2 判斷包含then方法的對象3.3 判斷$.ajax()返回的對象 一. $.ajax()返回值遇到的問題 當我們執行如下js代碼時&#xff0c;可以看到$.ajax()執行后&#xff0c;得到…

Linux python安裝 虛擬環境 virtualenv

根目錄創建 venvs 文件夾 sudo mkdir /venvs 進入 /venvs 目錄 cd /venvsp 創建虛擬環境&#xff0c;前提要按照 python3 安裝 的 命令 sudo apt install python3 sudo python3 -m venv 虛擬環境名 激活虛擬環境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安裝flask pip…

【C語言】深入解開指針(四)

&#x1f308;write in front :&#x1f50d;個人主頁 &#xff1a; 啊森要自信的主頁 ??真正相信奇跡的家伙&#xff0c;本身和奇跡一樣了不起啊&#xff01; 歡迎大家關注&#x1f50d;點贊&#x1f44d;收藏??留言&#x1f4dd;>希望看完我的文章對你有小小的幫助&am…

centos7上用docker部署mysql 5.7,并解決中文亂碼問題

1. 安裝docker 查看這篇文章的前半部分即可&#xff1a; 虛擬機上安裝docker&#xff0c;并安裝flink鏡像 2. 安裝mysql 5.7 2.1 下載mysql鏡像 可以使用docker search mysql命令查看遠程鏡像倉庫中的鏡像信息&#xff0c;或者訪問dockerhub去找需要的鏡像 這里直接拉取鏡像…

ubuntu借助overlay方案實現重啟自動還原

配置重啟還原OS 首先&#xff1a;sudo apt install overlayroot 安裝一下軟件 然后編輯配置文件&#xff1a;/etc/overlayroot.conf * overlayroottmpfs or overlayroottmpfs:PARAMETERS write all changes to a temporary (ram only) backing device A tmpfs mount will …

ubuntu22.04安裝wvp-gb28181-pro 2023-11-23最新版本(一鍵安裝)

下載程序 輸入下面命令&#xff0c;輸入普通用戶密碼&#xff0c;切換到 root用戶 sudo su git clone -b ubuntu_wvp_online_install_2023_0425 https://gitcode.net/zenglg/ubuntu_wvp_online_install.git 等待下載完成 安裝 進入到克隆下來的路徑中 cd /home/tuners/ub…

萬界星空科技低代碼云MES系統

所謂“云MES”&#xff0c;它是基于MES管理云平臺儲存大數據運算而來&#xff0c;區別于一般管理系統&#xff0c;云MES操作運行不需要獨立的服務器去儲存和運行&#xff0c;而是通過云端進行數據、儲存、運行&#xff0c;最后將計算完的數據在MES系統上呈現&#xff0c;呈現端…

讓國內AI模型解題:滑動窗口中找出最大值,文心一言,通義千問錯誤率100%,訊飛星火略勝一籌

最近&#xff0c;一些大廠陸續放出了自己的AI模型&#xff0c;處于日常的使用和準確度&#xff0c;我通過一道試題來看一下文心一言、訊飛星火和通義千萬的回答結果 本道題是一道很經典的算法題&#xff0c;請在滑動窗口中找出最大值 文心一言 第一次給出答案 package main…

vue中v-if與v-for的優先級?

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;Vue篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue中v-if與v-for的優先級? 目錄 v-if和v-for的優先級是什么&#xff1f; 一、作用 二、優先級…

移動機器人,開啟智能柔性制造新篇章

智能制造是當今工業發展的必然趨勢&#xff0c;而柔性制造則是智能制造的重要組成部分。在這個快速變革的時代&#xff0c;如何提高生產效率、降低成本、增強靈活性成為了制造業的關鍵挑戰。富唯智能移動機器人應運而生&#xff0c;為柔性制造注入了新的活力。 基于富唯智能AI-…

凸問題與非凸問題

凸函數&#xff1a;曲線上任意兩點連線上的點對應的函數值不大于該兩點對應的函數值得連線上的值&#xff0c;例如yx^2&#xff1b; 非凸函數&#xff1a;曲線上任意兩點連線上的點對應的函數值既有大于該兩點對應的函數值得連線上的值的部分也有小于的部分&#xff0c;例如&am…

Re51:讀論文 Language Models as Knowledge Bases?

諸神緘默不語-個人CSDN博文目錄 諸神緘默不語的論文閱讀筆記和分類 論文名稱&#xff1a;Language Models as Knowledge Bases? ArXiv網址&#xff1a;https://arxiv.org/abs/1909.01066 官方GitHub項目&#xff1a;https://github.com/facebookresearch/LAMA 本文是2019年…