【最短路徑Floyd算法詳解推導過程】看完這篇,你還能不懂Floyd算法?還不會?...

簡介

 Floyd-Warshall算法(Floyd-Warshall algorithm),是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。

簡單的說就是解決任意兩點間的最短路徑的一種算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用于計算有向圖的傳遞閉包。Floyd-Warshall算法的時間復雜度為O(N3),空間復雜度為O(N2)。

解決最短路徑問題有幾個出名的算法:

  • 1.dijkstra算法,最經典的單源最短路徑算法

  • 2.bellman-ford算法,允許負權邊的單源最短路徑算法

  • 3.spfa,其實是bellman-ford+隊列優化,其實和bfs的關系更密一點

  • 4.floyd算法,經典的多源最短路徑算法

今天先說說Floyd

Floyd算法詳解

描述

a)如圖:存在【0,1,2,3】 4個點,兩點之間的距離就是邊上的數字,如果兩點之間,沒有邊相連,則無法到達,為無窮大。?
b)要讓任意兩點(例如從頂點a點到頂點b)之間的路程變短,只能引入第三個點(頂點k),并通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。那么這個中轉的頂點k是0~n中的哪個點呢?
image.png

算法過程

準備

1)如圖 0->1距離為5,0->2不可達,距離為∞,0->3距離為7……依次可將圖轉化為鄰接矩陣(主對角線,也就是自身到自身,我們規定距離為0,不可達為無窮大),如圖矩陣 用于存放任意一對頂點之間的最短路徑權值。
image.png
2)再創建一個二維數組Path路徑數組,用于存放任意一對頂點之間的最短路徑。每個單元格的內容表示從i點到j點途經的頂點。(初始還未開始查找,默認-1)
image.png

image.png

開始查找

1)列舉所有的路徑(自己到自己不算)

image.png

即為:
0 -> 1 , 0 -> 2 , 0 -> 3 ,
1 -> 0 , 1 -> 2 , 1 -> 3 ,
2 -> 0 , 1 -> 1 , 1 -> 3
轉化成二元數組即為:
{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}

2)選擇編號為0的點為中間點

{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}
從上面中二元組集合的第一個元素開始,循環執行以下過程:

1. 用i,j兩個變量分別指向二元組里的兩個元素,比如{0,1}這個二元組,i指向0;j指向1
2. 判斷 (A[ i ][ 0 ]+A[ 0 ][ j ] ) < A[ i ][ j ] (即判斷 i -> j,i點到j點的距離是否小于從0點中轉的距離),如果false,則判斷下一組二元數組。
3. 如果表達式為真,更新A[ i ] [ j ]的值為A[ i ] [ 0 ] + A[ 0 ] [ j ],Path[ i ] [ j ]的值為點0(即設置i到j要經過0點中轉)

{0,1}按照此過程執行之后,
image.png
0->0 + 0->1的距離不小于0->1 ,下一組{0,2},{0,3}, {1,0},{2,0},{3,0}也同理

{1,2}按照此過程執行,A[1,0] 無窮大, A[0,2]也是無窮大,而A[1,4] = 4,則1點到2點肯定不會從0點中轉。

A[1][0]無窮大同理下一組{1,2}, {1,3}也同理

{2,1}按照此過程執行,A[2][0] = 3 ,A[0][1]=5 ,A[2][1] = 3那么 A[2][0]+ ,A[0][1] > A[2][1]
…………
依次類推,遍歷二元組集合,沒有0點適合做中轉的

3)選擇編號為1的點為中間點

4)選擇編號為2的點為中間點

依次類推,遍歷二元組集合{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}
,當遍歷{3,0}時,A[3][2] = 1 ,A[2][0]=3 ,A[3][0] = 不可達,那么 2點適合做從3點到0點之間的中轉點。
設置距離矩陣A[3][0] = 1+3 =4 ,Path矩陣Path[3][0] = 2點,表示從3到0在2點中轉,距離最近。
image.png
如圖表示(紅色單元格),從3到0,最近距離為4,在2點中轉 。

依次類推,遍歷完二元組集合
image.png

5)選擇編號為3的點為中間點,最終結果

依次類推,遍歷二元組集合,直到所有的頂點都做過一次中間點為止。
image.png

6)根據最終結果,就可以知道任意2點的最短距離和路徑

比如1點到2點怎么走?根據路徑Path矩陣,Path[1][2] = 3,表示從點3中轉,即 1-> 3 ->2
image.png

6)如果中轉點不止1個呢?

有時候不只通過一個點,而是經過兩個點或者更多點中轉會更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。
比如頂點1到頂點0,我們看數組Path
Path[1][0] = 3,說明頂點3是中轉點,那么再從3到0
Path[3][0] = 2,說明從3到0,頂點2是中轉點,然后在從2到0
Path[2][0] = -1,說明頂點2到頂點0沒有途徑頂點,也就是說,可以由頂點2直接到頂點0,即它們有邊連接。

最終,最短路徑為1->3->2->0,距離為 A[1][0] = 6 。
顯然,這是一個逐層遞進,遞歸的過程。

算法實現

基本定義

    //    表示無窮大 即不可達public static int MAX = Integer.MAX_VALUE;//    距離矩陣public int[][] dist;//    路徑Path矩陣public int[][] path;

核心算法

//        核心算法for(int k = 0 ; k < size ; k++){for(int i = 0;i < size;i++){for(int j = 0 ;j < size;j++){
//                判斷如果 ik距離可達且 kj距離可達 且 i和j的距離是否大于 i-> k 與 k->j的距離和if( dist[i][k] != MAX &&  dist[k][j] != MAX  &&  dist[i][j] > (dist[i][k] + dist[k][j]) ){path[i][j]= k;dist[i][j]= dist[i][k] + dist[k][j];}}}}

運行結果

image.png

源碼下載

Floyd算法java實現-源碼下載

Floyd算法java實現

看完這篇文章如果你還不會Floyd,請留言評論。
image.png

轉載于:https://www.cnblogs.com/Halburt/p/10756572.html

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

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

相關文章

java object類的常用子類_Java中Object類常用的12個方法,你用過幾個?

前言Java 中的 Object 方法在面試中是一個非常高頻的點&#xff0c;畢竟 Object 是所有類的“老祖宗”。Java 中所有的類都有一個共同的祖先 Object 類&#xff0c;子類都會繼承所有 Object 類中的 public 方法。先看下 Object 的類結構(快捷鍵&#xff1a;alt7)&#xff1a;1.…

leetcode面試題 04.12. 求和路徑(dfs)

給定一棵二叉樹&#xff0c;其中每個節點都含有一個整數數值(該值或正或負)。設計一個算法&#xff0c;打印節點數值總和等于某個給定值的所有路徑的數量。注意&#xff0c;路徑不一定非得從二叉樹的根節點或葉節點開始或結束&#xff0c;但是其方向必須向下(只能從父節點指向子…

javaweb學習總結(二十二)——基于Servlet+JSP+JavaBean開發模式的用戶登錄注冊

一、ServletJSPJavaBean開發模式(MVC)介紹 ServletJSPJavaBean模式(MVC)適合開發復雜的web應用&#xff0c;在這種模式下&#xff0c;servlet負責處理用戶請求&#xff0c;jsp負責數據顯示&#xff0c;javabean負責封裝數據。 ServletJSPJavaBean模式程序各個模塊之間層次清晰&…

2018黃河獎設計大賽獲獎_宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者

2018黃河獎設計大賽獲獎by Quincy Larson昆西拉爾森(Quincy Larson) 宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者 (Announcing Our freeCodeCamp 2018 Top Contributor Award Winners) Over the past 3 years, freeCodeCamp.org has grown from a small open source proje…

Log4j配置詳解

來自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和布局的&#xff0c;它可接keyvalue格式的設置或xml格式的設置信息。通過配置&#xff0c;可以創建出Log4J的運行環境。1. 配置文件 …

cors數據類型_如何根據RTK的差分格式選擇千尋cors賬號的源節點進行設置?

千尋cors賬號的設置中源節點是根據使用的品牌RTK是為雙星儀器還是三星儀器選擇&#xff0c;但問題就在于我們看到的RTK的技術參數中一般很少見到標注儀器的衛星系統&#xff0c;更多的是差分格式。其實千尋cors賬號的源節點也可以根據RTK的差分格式進行選擇&#xff0c;不過這兩…

java swing 串口_ComTest 接收串口數據,并顯示在文本框內,通過JavaSwing實現 Develop 265萬源代碼下載- www.pudn.com...

文件名稱: ComTest下載 收藏√ [5 4 3 2 1 ]開發工具: Java文件大小: 3157 KB上傳時間: 2016-09-21下載次數: 0提 供 者: 韓坤詳細說明&#xff1a;接收串口數據&#xff0c;并顯示在文本框內&#xff0c;通過JavaSwing實現-Receive serial data, and displayed in the t…

leetcode329. 矩陣中的最長遞增路徑(dfs)

給定一個整數矩陣&#xff0c;找出最長遞增路徑的長度。對于每個單元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四個方向移動。 你不能在對角線方向上移動或移動到邊界外&#xff08;即不允許環繞&#xff09;。示例 1:輸入: nums [[9,9,4],[6,6,8…

SQL大圣之路筆記——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 轉載于:https://www.cnblogs.com/allenzhang/p/6305564.html

用python繪制一條直線_python繪制直線的方法

本文實例為大家分享了python繪制直線的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下#!/usr/bin/env pythonimport vtk# 繪制通用方法def myshow(linepolydata):# Now well look at it.lineMapper vtk.vtkPolyDataMapper()if vtk.VTK_MAJOR_VERSION < 5:lineMap…

測試驅動開發 測試前移_我如何以及為什么認為測試驅動開發值得我花時間

測試驅動開發 測試前移by Ronauli Silva通過羅納利席爾瓦(Ronauli Silva) I first read about test driven development (TDD) in some technical reviews blog, but I barely read it (or thought about it). Why would people write tests first when they already knew the…

P2921 [USACO08DEC]在農場萬圣節Trick or Treat on the Farm

對于一個牛&#xff0c;它存在兩種狀態&#xff1a;1.處于聯通分量 2.不處于聯通分量。對于處于聯通分量的牛&#xff0c;求出聯通分量的大小&#xff1b;對于不處于聯通分量的牛&#xff0c;求出其距離聯通分量的路程聯通分量大小。 不同的聯通分量&#xff0c;染上不同的顏色…

ASP.NET MVC5+EF6+EasyUI 后臺管理系統(1)-前言與目錄(持續更新中...)

開發工具&#xff1a;VS2015(2012以上)SQL2008R2以上數據庫 您可以有償獲取一份最新源碼聯系QQ:729994997 價格 666RMB 升級后界面效果如下&#xff1a; 日程管理 http://www.cnblogs.com/ymnets/p/7094914.html 任務調度系統界面 http://www.cnblogs.com/ymnets/p/5065154.h…

leetcode106. 從中序與后序遍歷序列構造二叉樹(dfs)

根據一棵樹的中序遍歷與后序遍歷構造二叉樹。注意: 你可以假設樹中沒有重復的元素。例如&#xff0c;給出中序遍歷 inorder [9,3,15,20,7] 后序遍歷 postorder [9,15,7,20,3] 返回如下的二叉樹&#xff1a;3/ \9 20/ \15 7解題思路 根據后序遍歷的最后一個元素是父節點&…

【FRDM-K64F學習筆記】使用ARM mbed和Keil MDK下載你的第一個程序

FRDM-K64F開發平臺采用MK64FN1M0VLL12微控制器。該控制器包含一個帶有浮點單元的ARM Cortex-M4內核。其最高工作頻率為120MHz&#xff0c;具有256KB的RAM、1MB閃存以及許多其他外設。它非常適合大多數可以采用以太網、SD卡存儲以及板載模擬-數字轉換器的IoT應用。但是&#xff…

php 實時更新內容_億級視頻內容如何實時更新?優酷視頻背后的技術揭秘

簡介&#xff1a; 優酷視頻內容數據天然呈現巨大的網絡結構&#xff0c;各類數據實體連接形成了數十億頂點和百億條邊的數據量&#xff0c;面對巨大的數據量&#xff0c;傳統關系型數據庫往往難以處理和管理&#xff0c;圖數據結構更加貼合優酷的業務場景&#xff0c;圖組織使用…

ios集成firebase_如何使用Firebase將Google Login集成到Ionic應用程序中

ios集成firebaseby Ryan Gordon通過瑞安戈登(Ryan Gordon) 如何使用Firebase將Google Login集成到Ionic應用程序中 (How to integrate Google Login into an Ionic app with Firebase) A lot of apps these days need to maintain some form of user authentication. This hel…

面向對象三大核心特點,封裝、繼承和多態

封裝 封裝其實是一種思想&#xff0c;將事物狀態和功能裝進一個容器&#xff0c;那么這個容器在python中就是類&#xff0c;由這個類產生的對象都擁有類的屬性和功能 在面向對象的思想中&#xff0c;推崇將具有某些共同特征的事物歸為一類&#xff0c;那么這些事物就可以看做是…

java編寫某計算器控制臺程序_用java程序編寫一個計算器

點擊查看用java程序編寫一個計算器具體信息答&#xff1a;給你一個參考&#xff0c;希望不要被百度吞了當晚餐 import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.text.Decimal…

物聯網商機迸發 LPWAN芯片現身 本文轉自d1net(轉載)

聯發科技發表首款NB-IoT系統單芯片MT2625。來源&#xff1a;MediaTeK 物聯網(IoT)帶動的龐大商機吸引各方業者積極投入&#xff0c;尤其是各種聯網技術不斷現身&#xff0c;爭奪各式各樣極富發展潛力的應用領域。 根據IDC的調查報告&#xff0c;物聯網市場在2017年聲勢看漲&…