多源最短路(Floyd算法

多源最短路簡介

多源最短路算法用于解決圖中任意兩節點間最短路徑的問題,廣泛應用于交通網絡、社交關系分析、路由優化等場景。與單源最短路(如Dijkstra)不同,它一次性計算所有節點對的最短距離,適合需要全局路徑規劃的場景。

核心算法

Floyd算法:基于動態規劃,通過三重循環松弛所有中間節點,時間復雜度為 O(V3)O(V^3)O(V3),適合稠密圖或需要處理負權邊的場景。其空間復雜度為 O(V2)O(V^2)O(V2),需存儲所有節點對的距離矩陣。

Floyd算法:

Floyd算法本質是用動態規劃,來求任意兩個節點之間的最短路,也成為插點法。通過不斷在兩結點之間加入新的點,來更新最短路。且適用于任何圖,不管有向無向,邊權正負,但必須有最短路存在(也就是不存在負環)。
其實最本質上,就是分階段,逐步更新出最終結果。
算法流程

  1. 狀態表示:f[k][i][j] 表示,僅僅通過 [1,k] 這些點,計算出結點 i 走到結點 j 的最短路徑長度
  2. 狀態轉移方程:不選新來的點:f[k][i][j] = f[k-1][i][j] 選擇新來的點:f[k][i][j] = f[k-1][i][k] + f[k-1][k][j]
  3. 空間優化:只會用到上一層的狀態,因此可以優化掉第一維。f[i][j]為初始狀態下i到j的距離,如果沒有邊則為無窮
  4. 初始化:f[i][j] = 0
  5. 填表順序:一定要先枚舉 k 再枚舉 i 和 j。因為外面填表的時候需要依賴 k-1 曾的狀態,因此,必須先枚舉 k。

代碼實現

int main()
{cin >> n >> m;memset(f, 0x3f, sizeof f);for (int i = 1; i <= n; i++)f[i][i] = 0;for (int i = 1; i <= m; i++){int a, b, c; cin >> a >> b >> c;f[a][b] = f[b][a] = min(f[a][b], c);}//floydfor (int k = 1; k <= n; k++)//以那個點作為新的中間的橋梁節點(之前的點已經用過并保存在數組中,因此,k = n時使用的橋梁節點是前n個所有結點){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}for (int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)cout << f[i][j] << " ";cout << endl;}
}

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

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

相關文章

【攻防實戰】記一次攻防實戰全流程

那天我向眾神祈禱&#xff0c;最后回答我的卻只有掙扎十年依舊不甘的自己&#xff01;成功究竟是饋贈還是償還。 前言 網絡安全技術學習&#xff0c;承認??的弱點不是丑事&#xff0c;只有對原理了然于?&#xff0c;才能突破更多的限制。 擁有快速學習能力的安全研究員&…

Anaconda配置環境變量和鏡像

Anaconda配置環境變量和鏡像 下載失敗就是開了梯子 Anaconda 作用&#xff1a;包管理&#xff08;集中&#xff0c;有序&#xff09;和環境管理&#xff08;版本切換&#xff09;使用conda命令對虛擬環境創建、刪除自帶python解釋器pip&#xff08;python自帶的包管理工具&…

給定單詞倒排

實現代碼&#xff1a;public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 輸入的字符串String input scanner.nextLine();// 存儲單詞List<String> words new ArrayList<>();// 存儲當前單詞StringBuilder currentWord new S…

IO進程——進程引入、進程函數接口

一、引入1、進程&程序1.1 程序編譯好的可執行的文件存放在磁盤上的指令和數據的有序集合&#xff08;文件&#xff09;程序是靜態的&#xff0c;沒有任何執行的概念1.2 進程一個獨立的可調度的任務執行一個程序所分配的資源的總稱進程是程序執行的一次過程進程是動態的&…

周末游戲推薦:安卓端俄羅斯方塊,經典與創新的結合

前段時間&#xff0c;每到周末我都會給大家推薦一些離線的經典游戲&#xff0c;原本打算將這個傳統一直延續下去。然而&#xff0c;我實在找不到足夠好用且無廣告的游戲了。有些游戲剛開始用的時候還不錯&#xff0c;但用著用著就開始頻繁彈出廣告&#xff0c;這讓我實在不敢向…

《用 Scikit-learn 構建 SVM 分類模型:從原理到實戰的全流程解析》

《用 Scikit-learn 構建 SVM 分類模型:從原理到實戰的全流程解析》 一、引言:為什么選擇 SVM? 在機器學習的眾多算法中,支持向量機(SVM)以其強大的分類能力和良好的泛化性能,在文本分類、人臉識別、醫學診斷等領域廣泛應用。尤其在中小規模數據集上,SVM 往往能提供比…

一文學會CMakeLists.txt: CMake現代C++跨平臺工程化實戰

你能學到什么&#xff1f;朋友們好久不見&#xff0c;我是alibli&#xff0c;好久沒有更新博客了。今天本人將通過構造一個實際的虛擬小項目&#xff0c;來讓你徹底掌握CMake跨平臺工程構建&#xff0c;學會CMakeLists.txt語法。該項目實現了一個簡單的平方、立方的計算程序&am…

高并發場景下限流算法實踐與性能優化指南

高并發場景下限流算法實踐與性能優化指南 在大規模并發訪問環境中&#xff0c;合理的限流策略能保護后端服務穩定運行&#xff0c;避免系統因瞬時高并發導致資源耗盡或崩潰。本文將從原理出發&#xff0c;深入解析幾種主流限流算法&#xff0c;并結合Java和Redis給出完整可運行…

Vue3應用執行流程詳解

精確化的完整執行流程 (以 Vite Vue3 SPA 為例)整個過程可以分為兩部分&#xff1a;首次訪問的“冷啟動”和后續的Vue應用接管。第一部分&#xff1a;首次訪問與頁面加載客戶端&#xff1a;發送請求用戶打開瀏覽器&#xff0c;輸入 URL&#xff08;如 http://localhost:5173&a…

Redis 持久化與高可用實踐(RDB / AOF / Sentinel / Cluster 全解析)

這篇是我把幾套生產環境踩坑與復盤整理成的一份“從 0 到 1 長期可維護”的實踐文。目標是&#xff1a;明確策略、給出默認可用的配置模板、把常見坑一次講透。 適用場景&#xff1a;新項目選型、老項目穩定性加固、從單機遷移到 HA/Cluster、應對數據安全與故障切換要求。目錄…

Linux內核的PER_CPU機制

參考書《Linux內核模塊開發技術指南》 1.原理 在多核CPU的情況下&#xff0c;為了提高CPU并發執行的效率&#xff0c;對于某些不是必須要在核間進行同步訪問的資源&#xff0c;可以為每一個CPU創建一個副本&#xff0c;讓每個CPU都訪問自身的數據副本&#xff0c;而不是通過加鎖…

VSCode 的百度 AI編程插件

VSCode 的百度 AI編程插件主要是 Baidu Comate&#xff08;文心快碼&#xff09;&#xff0c;這是一款基于文心大模型的新一代編碼輔助工具&#xff0c;旨在提升開發者的編碼效率&#xff0c;讓寫代碼變得更簡單。以下是關于 Baidu Comate 的詳細介紹&#xff1a; 一、功能特點…

阿里云監控使用

阿里云的云監控服務&#xff08;CloudMonitor&#xff09;是一款簡單易用、功能強大的監控工具&#xff0c;主要用來幫助用戶實時監控阿里云上的各種資源&#xff08;比如服務器、數據庫、網絡等&#xff09;&#xff0c;并在出現問題時及時發出警報&#xff0c;確保業務穩定運…

嵌入式C語言-關鍵字typedef

定義和作用 typedef是C/C中的一個關鍵字&#xff0c;作用是為現有的數據類型&#xff08;int 、char 、flaot等&#xff09;創建新的別名&#xff0c;其目的是為了方便閱讀和理解代碼。 用法 typedef 原有類型名 新類型名;基本類型創建別名 typedef unsigned char uint8_t; typ…

【混合開發】【大前端++】Vue節點優化Dome之單節點輪播圖片播放視頻二

動圖更精彩 背景 Vue作為大前端開發頁面交互&#xff0c;在數字屏&#xff0c;智慧大屏等大屏幕開發過程中&#xff0c;輪播效果作為豐富的展示組件經常作為首選。但也因為這個組件的交互體驗很好&#xff0c;于是各種單點組件增加到輪播效果里。經過業務的擴展&#xff0c;人…

前端開發核心技術與工具全解析:從構建工具到實時通信

覺得主包文章可以的,可以點個小愛心喲&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 主頁:一位搞嵌入式的 genius-CSDN博客 系列文章專欄: https://blog.csdn.net/m0_73589512/category_13028539.html 前端開發核心技術與工具全解…

GPT 系列論文 gpt3-4 175B參數 + few-shot + 多模態輸入 + RLHF + system

GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】 GPT-4論文精讀 從1750億參數的文本預言家&#xff0c;到多模態的通用天才&#xff0c;OpenAI用兩次震撼世界的發布&#xff0c;重新定義了人工智能的可能性邊界。這份筆記將帶你深入GPT-3和GPT-4的核心突破&#…

.gitignore文件的作用及用法

目錄 ??.gitignore 文件的作用?? ??.gitignore 的基本語法?? ??Python 項目的 .gitignore 示例?? ??如何使用 .gitignore?? ??1. 創建 .gitignore 文件?? ??2. 編輯 .gitignore?? ??3. 檢查 Git 狀態?? ??常見問題?? ??Q1&#xff…

QEMU環境準備

QEMU環境準備 下載 qemu # qemu sudo apt install qemu-system-arm # gdb sudo apt install gdb-multiarchsudo apt-get update sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev \libpixman-1-dev libfdt-dev ninja-build下載并自行編譯 qemu(可…

003 cargo使用

cargo是什么 cargo 是 Rust 的構建系統和包管理器。Rust 開發者常用 cargo 來管理 Rust 工程和獲取工程所依賴的庫。 在上一篇文章中我們已經使用cargo new命令創建了一個名叫hello_rust的項目。也使用cargo run來運行項目。 cargo常用命令 cargo 除了創建工程以外還具備構建&a…