1. 程式人生 > >Floyd 演算法最短路徑問題精品(超詳解)

Floyd 演算法最短路徑問題精品(超詳解)

上一次的最短路徑dijkstra演算法精品程式碼(超詳解)
Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。

使用條件&範圍
通常可以在任何圖中使用,包括有向圖、帶負權邊的圖。

Floyd-Warshall 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來得到最佳路徑。

1.注意單獨一條邊的路徑也不一定是最佳路徑。
2.從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。
對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。
3.不可思議的是,只要按排適當,就能得到結果。

這裡寫圖片描述

程式碼說明幾點:

1、A[][]陣列初始化為各頂點間的原本距離,最後儲存各頂點間的最短距離。

2、path[][]陣列儲存最短路徑,與當前迭代的次數有關。初始化都為-1,表示沒有中間頂點。在求A[i][j]過程中,path[i][j]存放從頂點vi到頂點vj的中間頂點編號不大於k的最短路徑上前一個結點的編號。在演算法結束時,由二維陣列path的值回溯,可以得到從頂點vi到頂點vj的最短路徑。

初始化A[][]陣列為如下,即有向圖的鄰接矩陣。

程式碼如下:

#include <iostream>
#include <cstring>
#include <stack> using namespace std; #define MAX 100 #define INF 0x3f3f3f3f struct MGraph { int edges[MAX][MAX];//鄰接矩陣,記錄的是兩點之間的距離,也就是權值 int n,e;//頂點數和邊數 }G; int path[MAX][MAX];//記錄當前兩頂點間最短路徑上要經過的中間點 void init() { memset(G.edges, INF, sizeof(G.edges));//預設為INF for(int i = 0; i < MAX; i++){ //頂點到它本身的距離設定為0
G.edges[i][i] = 0; } } void insert(int u, int v, int w) { G.edges[u][v] = w;// } void printfPath(int u, int v, int path[][MAX]){ //輸出從u到v的最短路徑上頂點序列 cout << u << "->"; while(path[u][v] != -1){ cout << path[u][v] << "->"; u = path[u][v]; } cout << v; } void Floyd(MGraph G, int path[][MAX]){ //頂點預設從0到n int i, j, k; int A[MAX][MAX]; //這個雙迴圈對陣列A和path進行了初始化 for(i = 0; i < G.n; i++){ for(j = 0; j < G.n; j++){ A[i][j] = G.edges[i][j]; path[i][j] = -1; } } //下面三個迴圈是本演算法的主要操作,完成了以k為中間點對所有的頂點對{i, j}進行檢測和修改 for(k = 0; k < G.n; k++){ //選中的中間值 for(i = 0; i < G.n; i++){ //陣列橫座標 for(j = 0; j < G.n; j++){ //陣列縱座標 if(A[i][j] > A[i][k] + A[k][j]){ //如果以k中間點為中間點檢測到路徑更短 A[i][j] = A[i][k] + A[k][j]; //更新路徑值 path[i][j] = k; //更新要經過的中間點 } } } } } int main() { init(); int n, m;//n個點,m條邊 int a, x, y, w; cin >> m >> n; G.e = m; G.n = n; for(int i = 0; i < m; i++){ cin >> x >> y >> w; insert(x, y, w); } Floyd(G, path); int u, v; cin >> u >> v; printfPath(u, v, path); return 0; } /*測試資料 8 4 0 1 5 0 3 7 1 2 4 1 3 2 2 0 3 2 1 3 2 3 2 3 2 1 */

相關推薦

Floyd 演算法路徑問題精品

上一次的最短路徑dijkstra演算法精品程式碼(超詳解) Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。 使用條件&範圍 通常可以在任何圖中使用,包括有向圖、帶負權邊的圖。 F

Dijkstra和Floyd演算法----路徑演算法

Dijkstra 轉自:http://blog.chinaunix.net/uid-26548237-id-3834514.html Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外

無權路徑BFS廣度優先搜尋演算法圖論

廣度優先搜尋(BFS)演算法類似於樹中的層次搜尋: 從任意點s出發,先遍歷與s相鄰的點,然後再遍歷於相鄰的點相鄰的點。注意有向圖必須是順方向的鄰接點。 為什麼說廣度優先搜尋可以用來求無權最短路徑呢?因為,廣度優先搜尋每次都會先發現距離s為k的所有頂點,然後才會 發現距離s

內部排序演算法比較

一、題目描述 通過隨機資料比較各排序演算法的關鍵字比較次數和關鍵字移動次數,以 及執行時間,取得直觀感受。 二、設計要求 一、需求分析 實現各排序演算法,分別進行以下各組比較,並進行總結。 一、各演算法在不同規模下的比較。 1)比較範圍:直接插

歸併排序的java實現

歸併排序,見名知意,就是遞迴+合併 原理: 使用遞迴的手段,達到分割的目的,在分割後進行合併,合併也是遞迴的,這就是這裡的雙向過程都是遞迴進行的,結果如圖: 示例(例項): 以一下一串數字為例,首先進行拆分,然後合併,在合併的過程,進行排序,這裡需要說明的是,遞迴在整個過程中都

資料結構學習筆記——C++實現雙向迴圈連結串列模板類

定義了兩個標頭檔案分別放置結點類模板(Node.h)和雙鏈表模板(DoubleLinkList.h), 然後在原始檔的main函式中測試。 Node.h #pragma once # include <iostream> template <class

win10環境下安裝Ubantu雙系統

win10環境下安裝Ubantu雙系統 1.準備工作:先去ubantu官網(https://www.ubuntu.com/download)去下載ubantu映象。根據自己的實際情況選擇32位的或者6

tensorflow實現基於KNN和CNN演算法的阿拉伯數字識別程式碼

    廢話不多說,直接上專案;(大家如果感興趣可以加深度學習程式碼實現群:225215316,或者畢業想做此方向的加畢設討論群:457756921)    首先我們先將具體的數字圖片轉換為向量矩陣形式,儲存在txt檔案下,具體格式如下,其是數字0的矩陣向量形式:整個專案資料

python介面自動化三十九- logger 日誌 - 上

簡介  Python的logging模組提供了通用的日誌系統,可以方便第三方模組或者是應用使用。這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如檔案,HTTP GET/POST,SMTP,Socket等,甚至可以自己實現具體的日誌記錄方式。    &nbs

python介面自動化四十- logger 日誌 - 下

簡介   按照上一篇的計劃,這一篇給小夥伴們講解一下:(1)多模組使用logging,(2)通過檔案配置logging模組,(3)自己封裝一個日誌(logging)類。可能有的小夥伴在這裡會有個疑問一個logging為什麼分兩篇的篇幅來介紹她呢???那是因為日誌是非常重要的,用於記錄系統、軟體操作事件的記錄

python介面自動化四十一- 發xml格式引數的post請求

簡介   最近在工作中,遇到一種奇葩的介面,它的引數資料是通過xml,進行傳遞的,不要大驚小怪的,林子大了什麼鳥都有,每個人的思路想法不一樣,開發的介面也是各式各樣的,如果想要統一的話,必須是提前團隊已經做好溝通定好規則,這樣就像在產品線上生成一 樣規格大小一致。就不會出現前邊的問題了,如果出現了怎麼辦?

python介面自動化四十二- 專案結構設計之大結局

簡介   這一篇主要是將前邊的所有知識做一個整合,把各種各樣的磚塊---模組(post請求,get請求,logging,引數關聯,介面封裝等等)壘起來,搭建一個房子。並且有很多小夥伴對於介面專案測試的框架一籌莫展,吵吵著什麼時候才可以看到一篇相對於比較完整的專案原始碼,但是由於完整的專案屬於公司內部的程式碼

Appium+python自動化- 環境搭建—上

 簡介   今天是高考各地由於降水,特別糟糕,各位考生高考加油,全國人民端午節快樂。最近整理了一下自動化的東西,先前整理的python介面自動化已經接近尾聲。即將要開啟新的征程和篇章(Appium&python)。那麼首相的問題就是搭建環境了。好久沒搭建環境又踩了不少坑,appium的環境

Appium+python自動化- 環境搭建—下

簡介    巨集哥的人品還算說得過去,雖然很久沒有搭建環境了,但是換了新電腦裝置,一氣呵成,將android的測試開發環境已經搭建準備完畢。上一篇android測試開發環境已經準備好, 那麼接下來就是appium的環境安裝和搭建了。 嘿嘿!巨集哥和小夥伴們開個玩笑,不要覺得自人品不好,就不會成功

Appium+python自動化- SDK Manager

簡介   本來巨集哥一開始打算用真機做的,所以在前邊搭建環境時候就沒有下載SDK,但是由於許多小夥伴通過部落格發短訊息給巨集哥留言說是沒有真機,所以順應民意整理一下模擬器,畢竟“得民心者,得天下”。SDK顧名思義,Android SDK Manager就是一個Android軟體開發工

Appium+python自動化- 如何檢視程式所佔埠號和IP番外篇

簡介   這篇博文和分類看似沒有多大關係,但是也是從上一篇衍生出來的產物,因為涉及到FQ工具Lantern,就算是給關注和支援的小夥伴們拓展一下眼界和知識面。而且好多人都閱讀了上一篇沒發現那個參考部落格點不開嗎?那是因為還沒來的急,整理和編寫,今天再試一下就可以。   一個軟體可能佔用多個埠擁有多個目標I

Appium+python自動化- 模擬器

簡介   Appium是做安卓自動化的一個比較流行的工具,對於想要學習該工具但是又侷限於或許當前有些小夥伴沒 android 手機來說,可以通過安卓模擬器來解決該問題,下面就講解使用appium連線安卓模擬器的操作步驟。而巨集哥是由於手機資料線問題,也只好先用模擬器來替代真機玩了。所以沒有安卓手機的大款的小

Appium+python自動化- 連線模擬器並啟動淘寶APP

簡介    上一篇講解完模擬器的安裝、配置好以後,就好比我們手機已經買好,並且系統已經做好了,就差我們用資料線和電腦連線開始實戰了,這篇巨集哥就帶著小夥伴們和童鞋們趁熱打鐵,講解和分享一下如何連線模擬器(電腦版的虛擬手機),然後再安裝一款APP-淘寶為例。 一、appium+pycharm+連線

Git的使用--如何安裝和使用 github讓小白不在那麼白

簡介   剛開始寫了關於如何將原生代碼上傳到github上,但是有些小夥伴們不清楚如何安裝Git,這一篇就給小夥伴們普及一下Git的安裝和使用。適合剛開始用git的小白,大神或者大佬請繞道。 實際專案開發中,我們經常會用一些版本控制器來託管自己的程式碼,今天就來總結下Git的相關用法,廢話不多說,

Appium+python自動化- 初識琵琶女Appium千呼萬喚始出來,猶抱琵琶半遮面

簡介    “千呼萬喚始出來,猶抱琵琶半遮面”,經過前邊的各項準備工作,終於才把appium這位琵琶女請出來。那麼下邊就由巨集哥給各位看官、小夥伴們和童鞋們來引薦這位美女(帥哥)。這一篇主要是對前邊的內容做一個小小的總結,我們不能只顧得埋頭拉車,不記得擡頭看路可不行哦!