所有結點對的最短路徑問題(All-Paris Shortest Paths)
《演算法導論》所有結點對的最短路徑問題學習筆記
一、最短路徑和矩陣乘法
分析可知在一個圖中一條最短路徑的所有子路徑都是最短路徑,很容易想到我們可以使用動態規劃的思路來解決這個問題。
設為從i到j的一條最短路徑,且這條路徑最多包含m條邊。我們可以得到以下的遞推公式:
依據上面的遞推公式我們可以編寫程式碼如下,注意這裡實現的是已知和輸入的權重矩陣W推算:
觀察上面的程式碼,如果你使用程式碼實現過矩陣乘法就會發現兩者的相似之處,下面給出矩陣乘法的虛擬碼便於讀者比較。
接下來我們利用EXTENTED-SHORTEST_PATHS來定義一種新的矩陣運算,我們可以得到以下的矩陣序列。
直接迭代進行“乘法”運算是不明智的,我們引入了一種方法來改進演算法。
這樣我們可以減少進行矩陣乘法運算的次數,應對大規模的矩陣乘法運算非常有效。引入了這個方法後我們的時間複雜度為。
二、Floyd-Warshall演算法
在這裡我們使用一種不同的動態規劃公式來解決所有結點對最短路徑的問題,其執行時間為。
首先我們定義中間結點的概念。簡單路徑上的中間結點指的是路徑p上除和以外的任意結點,也就是處於集合中的結點。
假定圖G的所有節點為V={1,2,3...,n},考慮其中的一個子集{1,2,3...,k},這裡k是某個小於n的正數。考慮從結點i到結點j所有中間結點均取自集合{1,2,3..,k}的路徑,並設p為其中權重最小的路徑(路徑p是簡單路徑),則問題可以分解成下面兩種情況。
1. 如果k不是路徑p上的中間結點,則路徑p上所有中間結點都屬於集合{1,2,3,...,k-1}。這時結點i到結點j的一條最短路徑的中間結點取自於{1,2,3...,k-1}也等效於取自{1,2,3,...,k}的說法。
2. 如果結點k是路徑p上的中間結點,則我們可以將路徑p分解成,則可以推出和上所有中間結點都屬於集合。
基於上面的討論我們可以歸納出一個遞推公式:
這個時候我們再次使用自底向上的方法來求解遞迴式。
觀察程式碼的形式,我們發現我們可以再次使用矩陣運算來解決這個問題了。
相關文章
- 最短路徑問題
- 單源最短路徑(single-source shortest path )
- [ABC211D] Number of Shortest paths 題解
- HDU - 3790 (雙標準限制最短路徑)最短路徑問題
- 獲取所有鑰匙的最短路徑
- 最短路徑問題 (dijkstra演算法)演算法
- 九度oj-最短路徑問題
- 圖的最短路徑問題 詳細分解版
- 【論文筆記】Shortest Paths and Centrality in Uncertain Networks筆記AI
- 圖論最短路徑問題與matlab實現圖論Matlab
- 使用A*演算法解迷宮最短路徑問題演算法
- [最短路徑問題]Dijkstra演算法(含還原具體路徑)演算法
- VsCode相對路徑的問題VSCode
- python實現Dijkstra演算法之 最短路徑問題Python演算法
- 最短路徑演算法總結演算法
- 單源最短路徑:最短路徑性質的證明
- 最短路徑問題,BFS,408方向,思路與實現分析
- 迷宮的最短路徑
- 6.4.2最短路徑
- 圖 - 最短路徑
- 單源最短路問題
- 圖的最短路徑(Dijkstra | Floyd)
- 單源最短路徑
- 最短路:求最長最短路
- 最短路 || 最長路 || 次短路
- 關於 SAP UI5 應用 ui5.yaml 裡的 paths 對映問題UIYAML
- 演算法與資料結構之-圖的最短路徑演算法資料結構
- React Native環境搭建--總結遇見的所有問題!!React Native
- QOJ #8673. 最短路徑
- 最短路徑演算法演算法
- 最短路徑(dijkstra 與 Floyd)
- 矩陣求最短路徑矩陣
- 路徑問題
- 幾個最短路徑的演算法演算法
- 最短路徑(Floyd演算法)演算法
- 最短路徑(Dijskra演算法)JS演算法
- Djikstra最短路徑演算法演算法
- [筆記](更新中)最短路問題的變形筆記