所有結點對的最短路徑問題(All-Paris Shortest Paths)

Britjeans發表於2018-06-12

《演算法導論》所有結點對的最短路徑問題學習筆記

我們已經討論了單源最短路徑問題,在這篇部落格中我們將求解一個圖中所有節點之間的最短路徑。

一、最短路徑和矩陣乘法

分析可知在一個圖中一條最短路徑的所有子路徑都是最短路徑,很容易想到我們可以使用動態規劃的思路來解決這個問題。

為從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分解成,則可以推出上所有中間結點都屬於集合

基於上面的討論我們可以歸納出一個遞推公式:


這個時候我們再次使用自底向上的方法來求解遞迴式。


觀察程式碼的形式,我們發現我們可以再次使用矩陣運算來解決這個問題了。






相關文章