圖論之Dijkstra最短路徑算法

圖論中最有名的問題可能就屬最短路徑了。最短路徑問題要求解的是:如果從圖中某一頂點(diǎn)(稱為源點(diǎn))到達(dá)另一頂點(diǎn)(稱為終點(diǎn))的路徑可能不止一條,如何找到一條路徑,使得沿此路徑各邊上的權(quán)值總和(即從源點(diǎn)到終點(diǎn)的距離)達(dá)到最小,這條路徑稱為最短路徑(shortestpath)。最短路徑有很多特殊的情況,包括有向圖還是無向圖,有沒有負(fù)權(quán)邊等。這幾天我想介紹一下幾種常用的最短路徑算法。今天先講情況最簡(jiǎn)單(有向圖,沒有負(fù)權(quán)邊),但也是最有名Dijkstra算法。

首先描述一下問題:給定一個(gè)有向圖G和源點(diǎn)v,求v0到G中某個(gè)頂點(diǎn)u的最短路徑。限定各邊上的權(quán)值大于或等于0。

算法的基本思想很簡(jiǎn)單:所有的頂點(diǎn),按照它到源點(diǎn)v的距離,客觀上存在一個(gè)從小到大的順序,我們只要按照這個(gè)順序找下去,總有一步會(huì)找到目標(biāo)頂點(diǎn)u,而此時(shí)的距離就是u到源點(diǎn)v的距離。

想法簡(jiǎn)單,但關(guān)鍵是怎么按照“客觀存在的大小順序”計(jì)算各點(diǎn)到源點(diǎn)v的距離呢?我們先簡(jiǎn)單思考一下,按照距離v的遠(yuǎn)近順序,v一定是排第一的,然后呢,排第二的一定是和v直接相連的點(diǎn)吧,否則總有一個(gè)點(diǎn)介于排第二的點(diǎn)和v之間,而它到v的距離肯定也比第二到v的距離近,那這個(gè)第二就有些名副其實(shí)了。比較麻煩的是,排第三的點(diǎn)在哪里?利用遞歸的想法就會(huì)發(fā)現(xiàn),排第三的點(diǎn)應(yīng)該從那些和v直接相連,或者和第二名直接相連的點(diǎn)中去尋找,否則第三名就會(huì)名副其實(shí)了。總結(jié)一下,需要找第n個(gè)點(diǎn)時(shí),只需要在那些和前n-1個(gè)點(diǎn)直接相連的點(diǎn)里面找就行了。

Dijkstra算法的具體實(shí)現(xiàn)方法為:

1.設(shè)置兩個(gè)頂點(diǎn)的集合T和S:

a) S中存放已找到最短路徑的頂點(diǎn),初始時(shí),集合S中只有一個(gè)頂點(diǎn),即源點(diǎn)v0;

b) T中存放當(dāng)前還未找到最短路徑的頂點(diǎn);

2.在T集合中選取當(dāng)前長(zhǎng)度最短的一條最短路徑(v0,…,vk),從而將vk加入到頂點(diǎn)集合S中,并修改源點(diǎn)v0到T中各頂點(diǎn)的最短路徑長(zhǎng)度;重復(fù)這一步驟,直到所有的頂點(diǎn)都加入到集合S中,算法就結(jié)束了。

下面給個(gè)用Dijkstra計(jì)算最短路徑的例子

1)首先求出長(zhǎng)度最短的一條最短路徑,即頂點(diǎn)0到頂點(diǎn)2的最短路徑,其長(zhǎng)度為5,其實(shí)就是頂點(diǎn)0到其他各頂點(diǎn)的直接路徑中最短的路徑(v0→v2)。

2)頂點(diǎn)2的最短路徑求出來以后,頂點(diǎn)0到其他各頂點(diǎn)的最短路徑長(zhǎng)度有可能要改變。例如從頂點(diǎn)0到頂點(diǎn)1的最短路徑長(zhǎng)度由∞縮短為20,從頂點(diǎn)0到頂點(diǎn)5的最短路徑長(zhǎng)度也由∞縮短為12。這樣長(zhǎng)度次短的最短路徑長(zhǎng)度就是在還未確定最終的最短路徑長(zhǎng)度的頂點(diǎn)中選擇最小的,即頂點(diǎn)0到頂點(diǎn)5的最短路徑長(zhǎng)度,為12,其路徑為(v0→v2→v5)。

3)頂點(diǎn)5的最短路徑求出來以后,頂點(diǎn)0到其他各頂點(diǎn)的最短路徑長(zhǎng)度有可能要改變。例如從頂點(diǎn)0到頂點(diǎn)3的最短路徑長(zhǎng)度由30縮短為22,從頂點(diǎn)0到頂點(diǎn)4的最短路徑長(zhǎng)度也由∞縮短為30。這樣長(zhǎng)度第三短的最短路徑長(zhǎng)度就是在還未確定最終的最短路徑長(zhǎng)度的頂點(diǎn)中選擇最小的,即頂點(diǎn)0到頂點(diǎn)1的最短路徑長(zhǎng)度,為20,其路徑為(v0→v2→v1)。

4)此后再依次確定頂點(diǎn)0到頂點(diǎn)3的最短路徑(v0→v2→v5→v3),其長(zhǎng)度為22;以及頂點(diǎn)0到頂點(diǎn)4的最短路徑(v0→v2→v1→v4),其長(zhǎng)度為28。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容