帶有匯合節(jié)點的加權有向圖的單源最短路徑問題

加權有向圖的單源最短路徑問題是圖論中的經典問題。單源最短路徑問題指的是從一個節(jié)點出發(fā)膊夹,計算到圖中其它所有節(jié)點的最短路徑的問題盆昙。Dijkstra算法可以有效解決這個問題(權值不能為負數)熟掂。

對于加權有向圖中的節(jié)點v,它的任意一個前繼鄰居節(jié)點u到v的路徑(u,v)是一個獨立的路徑检号,不依賴任何其它前繼鄰居節(jié)點u'到v的路徑(u',v)

我們在這里對圖做一個擴展蛙酪,增加一種特殊的節(jié)點齐苛,稱為匯合節(jié)點。從起始節(jié)點到匯合節(jié)點的路徑是匯合節(jié)點的一個或多個前繼鄰居節(jié)點到匯合節(jié)點的路徑的組合桂塞,組合時對各個分支距離進行加法和乘法運算凹蜂。

簡單點講,要想走到匯合節(jié)點阁危,必須先同時走到它的一個或多個前繼鄰居節(jié)點炊甲。至于具體要走過哪幾個前繼鄰居節(jié)點,要根據具體的條件要求來判斷欲芹。

這種情況在生活中經常會遇到卿啡,一件事情有多個可選的前置條件,想要完成這件事情菱父,必須先完成一個或多個前置條件颈娜。

以圖一為例:

圖一

節(jié)點d是匯合節(jié)點剑逃,這里的匯合條件是從起始節(jié)點a到d節(jié)點的路徑是其所有前繼相鄰節(jié)點的路徑的和。也就是說要想走到d官辽,必須先同時走到b和c蛹磺,然后才能計算從a到d的距離|a->d|=|a->b|+|b->d|+|a->c|+|c->d|

對于擴展后的帶有匯合節(jié)點的加權有向圖的單源最短路徑問題應該如何解決同仆?Dijkstra算法是否依然有效萤捆?我們來分析一下這個問題。

Dijkstra算法的原理

Dijkstra算法的特點是從起始節(jié)點開始向外層層擴展俗批,直到所有節(jié)點都被訪問到俗或。

Dijkstra算法將節(jié)點分為兩組,一個是已求出最短路徑的節(jié)點的集合S(初始時只有起始節(jié)點)岁忘,另一個是未確定最短路徑的節(jié)點的集合U辛慰。每次新擴展一個距離最短的節(jié)點,更新與其相鄰節(jié)點的距離(只在相鄰節(jié)點當前的最短路徑大于經過擴展節(jié)點的路徑時更新)干像。當所有邊的權值都為正時帅腌,不會存在一個距離更短的沒擴展過的節(jié)點,所以這個節(jié)點的距離不會再被改變麻汰,將其加入到S中速客。因此,在將節(jié)點加入到S的過程中五鲫,總是保持從起始節(jié)點到S中任何節(jié)點的最短距離都不大于從起始節(jié)點到U中任何節(jié)點的最短距離溺职。從起始節(jié)點開始,直至集合U中的所有節(jié)點都轉移到了集合S中臣镣。

以圖二為例:

圖二

假設a為起始節(jié)點辅愿。從a出發(fā),有b和c兩個相鄰節(jié)點忆某。此時需要從|ab||ac|中選擇一個距離最短的路徑点待。如果|ac|<|ab|,因為權值為正弃舒,所以|ac|<|ab|+|bc|一定成立癞埠,因此c一定是到a的路徑最短的節(jié)點,將c加入到集合S中聋呢。反之苗踪,如果|ab|>|ac|,所以b是到a的距離最短的節(jié)點削锰,將b加入到集合S中通铲,此時從a到c的最短路徑還要通過比較|ab|+|bc||ac|的大小來決定。

匯合節(jié)點引入的問題

從Dijkstra算法的原理可以看到器贩,節(jié)點向外擴展的過程中朋截,每次都要從集合U中選擇一個距離最短的節(jié)點。匯合節(jié)點的問題在于吧黄,在擴展節(jié)點時部服,無法立即計算出匯合節(jié)點的最短路徑。因為匯合節(jié)點要求對它的所有前繼相鄰節(jié)點進行組合計算拗慨,而在擴展時難以保證匯合節(jié)點的所有前繼相鄰節(jié)點都已計算出最短路徑廓八。

如果不能計算出匯合節(jié)點的最短路徑,那么就無法按照Dijkstra算法的要求選擇出距離最短的節(jié)點赵抢。此時應該如何處理剧蹂?

以圖一為例,從a出發(fā)先到達c昌讲。更新c的相鄰節(jié)點時国夜,無法計算匯合節(jié)點d的距離减噪。這種情況下應該如何處理短绸?

對匯合節(jié)點的分析

我們首先來看節(jié)點向外擴展的過程,為什么每次都要從U集合中選擇距離最短的節(jié)點筹裕?從Dijkstra算法的原理可以知道醋闭,因為需要保證不會存在距離更短的節(jié)點,從而保證被選中節(jié)點的當前路徑就是從起始節(jié)點到它的最短路徑朝卒,所以被選中節(jié)點可以放到集合S中证逻。

對于圖中的任意一個節(jié)點,如果它的相鄰節(jié)點存在匯合節(jié)點抗斤,有兩種情況:

  1. 匯合節(jié)點是路徑最短的節(jié)點
  2. 非匯合節(jié)點是路徑最短的節(jié)點

對于情況2囚企,非匯合節(jié)點會被選擇作為距離最短的節(jié)點,符合Dijkstra算法的要求瑞眼,不存在問題龙宏。

對于情況1,我們深入分析一下伤疙。

對于非匯合節(jié)點u和它的相鄰節(jié)點v银酗,我們用λu、λv表示u和v的最短路徑距離徒像,λ|uv|表示u和v之間的距離黍特,可以知道:

    λv=λu+λ|uv|
=>  λv>λu, λv>λ|uv|

對于匯合節(jié)點v和它的前繼相鄰節(jié)點u1,u2...uN,λv=C(λu1+λ|u1v|,λu2+λ|u2v|...,λuN+λ|uNv|)锯蛀,其中C為匯合節(jié)點v的最短路徑計算函數灭衷。可以知道對于匯合節(jié)點v的任意一個位于v的最短路徑中的前繼相鄰節(jié)點u:

    λv>=∑i(λui+λ|uiv|)(i=1~N)
=>  λv>=λu+λ|uv|
=>  λv>λu, λv>λ|uv|

對于普通節(jié)點u旁涤、u的普通相鄰節(jié)點v以及u的匯合相鄰節(jié)點w翔曲,如果w路徑更短经备,則有λw<λv,假設組成w的最短路徑的任意前繼相鄰節(jié)點為x(x可能包括u)部默,根據上面內容可以知道:

    λw<λv
    λw>=λx+λ|xw|, λv=λu+λ|uv|
=>  λx+λ|xw|<λu+λ|uv|
=>  λx<λu+λ|uv|
=>  λx<λv

如果x=u侵蒙,那么λ|uw|<λ|uv|,說明uw之間的距離小于uv之間的距離傅蹂。

如果x≠u, λx<λu纷闺,則x先于u被訪問,因而w先于v更新份蝴。

如果x≠u, λu<λx犁功,則u先于x被訪問,但是根據λx<λv婚夫,x會先于v被訪問浸卦。

根據上面的推導,如果在節(jié)點u的相鄰節(jié)點中匯合節(jié)點w的距離最短案糙,那么組成匯合節(jié)點w的最短路徑的任意前繼相鄰節(jié)點x都會優(yōu)先于u的其它任意相鄰節(jié)點v被訪問限嫌。這也就意味著匯合節(jié)點w能夠先于v被訪問。

調整Dijkstra算法

根據上面的推導时捌,對于帶有匯合節(jié)點的加權有向圖的單源最短路徑問題仍然可以使用Dijkstra算法怒医,只需做一個局部的調整:在向外擴展節(jié)點時,如果其相鄰節(jié)點中有匯合節(jié)點奢讨,則更新其對應的分支路徑的距離稚叹,但是直至匯合節(jié)點滿足了C函數可以計算完全的距離時才參與后續(xù)的最短距離節(jié)點的選擇。

示例

以圖三為例:

圖三

其中e為匯合節(jié)點拿诸,其C函數為所有前置相鄰節(jié)點構成的路徑的總和扒袖。

以a為起始節(jié)點,其計算步驟如下:

  1. 初始化

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ Φ Φ Φ Φ Φ Φ
    距離 +∞ +∞ +∞ +∞ +∞ +∞ +∞
    訪問順序
  2. 訪問a節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a Φ Φ Φ Φ
    距離 0 5 6 +∞ +∞ +∞ +∞
    訪問順序 1

    可以發(fā)現亩码,b是距離a路徑最短的未訪問節(jié)點季率。

  3. 訪問b節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b? Φ Φ
    距離 0 5 6 15 6? +∞ +∞
    訪問順序 1 2

    可以發(fā)現,b的鄰居節(jié)點中存在匯合節(jié)點e蟀伸,我們只更新通過b到e的路徑的距離蚀同,因為還有一個前繼節(jié)點形成的路徑暫時不確定,所以無法計算e的距離啊掏,因此e不參與下一輪的選擇蠢络。
    排除e之后,c是距離a路徑最短的未訪問節(jié)點迟蜜。

  4. 訪問c節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b+c c Φ
    距離 0 5 6 15 6+8=14 11 +∞
    訪問順序 1 2 3

    更新c到e的路徑的距離刹孔,就可以計算a到e的距離了。
    可以發(fā)現,f是距離a路徑最短的未訪問節(jié)點髓霞。

  5. 訪問f節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b+c c f
    距離 0 5 6 15 6+8=14 11 16
    訪問順序 1 2 3 4

    可以發(fā)現卦睹,e是距離a路徑最短的未訪問節(jié)點。

  6. 訪問e節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b+c c e
    距離 0 5 6 15 6+8=14 11 15
    訪問順序 1 2 3 5 4

    因為從e到g的距離比從f到e更近方库,因此更新g结序。
    可以發(fā)現,d是距離a路徑最短的未訪問節(jié)點纵潦。

  7. 訪問d節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b+c c e
    距離 0 5 6 15 6+8=14 11 15
    訪問順序 1 2 3 6 5 4

    因為從d到g的距離比從e到g更遠徐鹤,因此不用更新g。
    可以發(fā)現邀层,g是距離a路徑最短的未訪問節(jié)點返敬。

  8. 訪問g節(jié)點并更新其相鄰節(jié)點的距離

    節(jié)點 a b c d e f g
    前序訪問節(jié)點 Φ a a b b+c c e
    距離 0 5 6 15 6+8=14 11 15
    訪問順序 1 2 3 6 5 4 7

    至此,圖中所有節(jié)點都已被訪問寥院。

我們可以發(fā)現劲赠,從a到g的最短路徑是經過匯合節(jié)點e形成的路徑,其距離為15秸谢。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末凛澎,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子钮追,更是在濱河造成了極大的恐慌预厌,老刑警劉巖阿迈,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件元媚,死亡現場離奇詭異,居然都是意外死亡苗沧,警方通過查閱死者的電腦和手機刊棕,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來待逞,“玉大人甥角,你說我怎么就攤上這事∈队#” “怎么了嗤无?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怜庸。 經常有香客問我当犯,道長,這世上最難降的妖魔是什么割疾? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任嚎卫,我火速辦了婚禮,結果婚禮上宏榕,老公的妹妹穿的比我還像新娘拓诸。我一直安慰自己侵佃,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布奠支。 她就那樣靜靜地躺著馋辈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倍谜。 梳的紋絲不亂的頭發(fā)上首有,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音枢劝,去河邊找鬼井联。 笑死,一個胖子當著我的面吹牛您旁,可吹牛的內容都是我干的烙常。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蚕脏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦锯?” 一聲冷哼從身側響起驼鞭,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尺碰,沒想到半個月后挣棕,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亲桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年洛心,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题篷。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡词身,死狀恐怖,靈堂內的尸體忽然破棺而出番枚,到底是詐尸還是另有隱情法严,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布葫笼,位于F島的核電站深啤,受9級特大地震影響,放射性物質發(fā)生泄漏渔欢。R本人自食惡果不足惜墓塌,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苫幢,春花似錦访诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哀峻,卻和暖如春涡相,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剩蟀。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工催蝗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育特。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓丙号,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缰冤。 傳聞我的和親對象是個殘疾皇子犬缨,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容