(11)圖算法3: 所有節(jié)點(diǎn)對(duì)最短路徑與最大流問(wèn)題

所有結(jié)點(diǎn)對(duì)的最短路徑問(wèn)題

Floyd算法

  • 前提條件: 可以有負(fù)權(quán)重邊, 但是不能有負(fù)權(quán)重的環(huán).
  • 特點(diǎn): 動(dòng)態(tài)規(guī)劃, V^3.
  • 按照動(dòng)態(tài)規(guī)劃的步驟:
    • 最優(yōu)子結(jié)構(gòu): d[i][j]表示結(jié)點(diǎn)vi至結(jié)點(diǎn)vj的最短路徑, 而帶上了上標(biāo)d[i][j]<k>表示允許取用v1~vk情況下結(jié)點(diǎn)vi至vj的最短路徑. 我們可以看出這里存在了一個(gè)最優(yōu)子結(jié)構(gòu), 因?yàn)槿∮?k的最短路徑是在取用1k-1的最短路徑和用上k的最短路徑之間選取的min.
    • 遞歸式: d[i][j]<k> = min{ d[i][j]<k-1>, (d[i][k]<k-1>+d[k][j]<k-1>) }. (常規(guī)情況, 當(dāng)k>=1時(shí))
      或者 = w(i, j); (邊界情況, 當(dāng)k=0時(shí)) //其中i=j時(shí), 應(yīng)該w(i, i) = 0; 沒(méi)有(i, j)邊的時(shí)候, 為INF;
    • 自底向上計(jì)算:
      • 三個(gè)循環(huán), i, j, k. k循環(huán)是用來(lái)算d[i][j]這個(gè)格子的min, 總共是一個(gè)二維矩陣, 因此要算O(V^3)時(shí)間.
Floyd(W) {  //W[V][V]是二維數(shù)組, 存放邊的權(quán)重.
let D[V][V] be a new array, and D = W;
for k = 1~V:
    for i = 1~V:
        for j = 1~V:
            D[i][j] = min{ D[i][j], D[i][k]+D[k][j] };
return D;
}

用于稀疏圖的Johnson算法

前提條件: 允許有負(fù)權(quán)重的環(huán);
特點(diǎn): 利用G', h(v) = δ(s, v)來(lái)為Dijkstra創(chuàng)造無(wú)負(fù)權(quán)重邊的條件;

Johnson(G, w) {
compute G':
    G'.V = G.V ∪ {s};
    G'.E = G.E ∪ {(s, v) for all v ∈ G.V}
    w(s, v) = 0 for all v ∈ G.V
if Bellman-Ford(G', w, s) == FALSE: {
    print "The graph contains negative loop;"
    }
else: {
    for each v ∈ G'.V:
        set h(v) = δ(s, v) from Bellman-Ford
    for each edge(u, v)∈G'.E:
        set w'(u, v) = w(u, v) + h(u) - h(v)    //set all weight to non-negative.
    let D = d[][] be n*n matrix
    for each u∈G.V:
        do Dijkstra(G, w', u)
        for each v∈G.V:
            d[u][v] = δ'(u, v) + h(v) - h(u)
    return D matrix
    }
}

算法時(shí)間復(fù)雜度分析:

Bellman-Ford已知是O(VE) 因?yàn)橛蠽-1輪對(duì)所有邊的操作, Dijkstra是O(ElgV)或者O(VlgV+E), 因?yàn)閑xtract-min有V次, decrease-key有E次.
本算法主要時(shí)間顯然是花在了對(duì)所有點(diǎn)進(jìn)行Dijkstra操作, 顯然總時(shí)間是O(VElgV) 或者 O(V^2*lgV+VE).

最大流問(wèn)題

基本方法

Ford-Fulkerson method

Ford-Fulkerson-Method(G, s, t) 
initiate flow f to 0
while there exists an augmenting path p in residual network Gf:
    augment flow f along p
return f

定理

最大流最小割定理

定理: f是G的一個(gè)最大流
= 殘存網(wǎng)絡(luò)Gf不再包含任何增廣路徑
= |f| = c(S, T) , 其中(S, T)是流網(wǎng)絡(luò)G的某個(gè)切割;

  • 說(shuō)明: 第三行某個(gè)切割可以是任意一個(gè)切割, 因?yàn)榱骶W(wǎng)絡(luò)具有切割流量相等的性質(zhì).

基本款算法

Ford Fulkerson Basic

/* 基本的FF最大流算法 */
// 約定: (u,v).f代表邊(u,v)上當(dāng)前的流量;
// Cf(p)代表path p整條最短路徑所允許的殘余網(wǎng)絡(luò)最大流量
// Cf(u, v)代表(u, v)邊上的殘余網(wǎng)絡(luò)流量, 本質(zhì)上是一種潛能(potential)

Ford-Fulkerson(G, s, t)
for each edge (u, v)∈G.E:
    (u, v).f = 0
while there exists an augmenting path p in residual network Gf:
    Cf(p) = min{Cf(u, v): (u,v) is in path p}
    for each edge(u, v) in path p:
        if (u, v) ∈ G.E:
            (u, v).f = (u, v).f + Cf(p)
        else:
            (v, u).f = (v, u).f - Cf(p)
  • 找augmenting path的方法: 用BFS對(duì)殘存網(wǎng)絡(luò)Gf進(jìn)行搜索, 找到一條path;

時(shí)間復(fù)雜度分析: 算法初始化花費(fèi)Θ(E), 而while循環(huán)的條件如果是用廣度優(yōu)先搜索, 每次要花O(V+E) = O(E), 而循環(huán)內(nèi)求殘余容量Cf(p)操作最多有|V-1|條邊構(gòu)成一條最短路徑, 因此是O(V), 而接下去對(duì)path上所有邊的操作, 也是O(V)的. 因?yàn)閂<=E, 因此單次while循環(huán)消耗O(E), 而由我們的關(guān)鍵邊上限定理, 可以知道最多有VE條關(guān)鍵邊, 每條path至少一條關(guān)鍵邊, 因此有O(VE)條path, 因此總時(shí)間復(fù)雜度為O(V·E^2).

算法的正確性:
為什么使用BFS不斷找出最短邊(所有邊長(zhǎng)度設(shè)定為1), 可以實(shí)現(xiàn)把while循環(huán)控制在VE次呢?

先介紹一個(gè)基礎(chǔ): δ(s, v)單調(diào)遞增定理

從源點(diǎn)s到非終點(diǎn)t的某個(gè)點(diǎn)v的最短距離總是在遞增, 即δ'(s, v) >= δ(s, v). 證明:
反證法: 假設(shè)某輪增加流量之后, 存在δ'(s, v)<δ(s, v). 這時(shí), 我們找處于邊界v點(diǎn), 從s到v點(diǎn)的最短路徑上, v前面一個(gè)點(diǎn)u滿足δ'(s, u)=δ(s, u). 已知δ(s, v) <= δ(s, u)+1, δ'(s, u)<=δ'(s, v)+1, δ'(s, v)<=δ(s, v)-1, 那么δ(s, u)+1 >= δ'(s, v)-1, 也就是δ(s, u) >= δ'(s, v)-2與δ'(s, u)<=δ'(s, v)+1是矛盾的.

更加直覺(jué)一些地, 隨著算法運(yùn)行, 有些邊可能由于流量被加到滿導(dǎo)致在殘存網(wǎng)絡(luò)中消失:

  • 如果消失的邊在s~v的最短路徑上, 顯然δ(s, v)將不得不繞別的路, 因而會(huì)增加;
  • 如果消失的邊不在s~v的最短路徑上, 那么也不會(huì)影響到δ(s, v).
  • 要認(rèn)識(shí)到, 只有當(dāng)圖中出現(xiàn)了連接之前從未被連接過(guò)的兩點(diǎn)的新邊, 才存在使δ(s, v)下降的可能性.

關(guān)鍵邊O(VE)上界的推導(dǎo):

(u, v)如果第一次被當(dāng)做最短路徑p的關(guān)鍵邊話, 會(huì)從Gf殘存網(wǎng)絡(luò)圖上消失, 此時(shí)有δ(s, v) = δ(s, u)+1;
其如果想再次成為關(guān)鍵邊, 至少要滿足必要條件 (v, u).f 被增加過(guò), 且(u, v)再次被當(dāng)成最短路徑的一部分. (v, u).f要被增加過(guò)的話, 那么(v, u)邊得被納入過(guò)最短路徑, 那么(v, u)滿足了δ'(s, u) = δ'(s, v)+1;
已知定理26.7說(shuō)殘存網(wǎng)絡(luò)中δ(s, v)隨著每次流量的遞增操作而單調(diào)遞增 ==> δ'(s, v) >= δ'(s, v), 所以δ'(s, u) = δ'(s, v)+1>=δ(s, v)+1 = δ(s, u)+2.
因此我們得到了一個(gè)性質(zhì): 當(dāng)(u, v)邊成為一次關(guān)鍵邊后, δ(s, u) = δ(s, u)+2, 即關(guān)鍵邊遞增, 遞增的步長(zhǎng)為2.
已知從起點(diǎn)s到終點(diǎn)t最短路徑最長(zhǎng)不能超過(guò)V-1, u除了不可能是終點(diǎn)t外, 可以是任何點(diǎn), 因此(u, v)最多可以當(dāng)關(guān)鍵邊(V-2)/2次, 從而每條邊只能當(dāng)關(guān)鍵邊次數(shù) = O(V/2) = O(V), 那么對(duì)所有邊來(lái)說(shuō), 最多只能有O(VE)次關(guān)鍵邊的出現(xiàn).
延伸: O(VE)條關(guān)鍵邊, 而每個(gè)增廣路徑至少有一條關(guān)鍵邊, 因此O(VE)條增廣路徑.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖斤彼,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蘸泻,居然都是意外死亡畅卓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蟋恬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翁潘,“玉大人,你說(shuō)我怎么就攤上這事歼争“萋恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵沐绒,是天一觀的道長(zhǎng)俩莽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乔遮,這世上最難降的妖魔是什么扮超? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蹋肮,結(jié)果婚禮上出刷,老公的妹妹穿的比我還像新娘。我一直安慰自己坯辩,他們只是感情好馁龟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漆魔,像睡著了一般坷檩。 火紅的嫁衣襯著肌膚如雪却音。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天矢炼,我揣著相機(jī)與錄音系瓢,去河邊找鬼。 笑死句灌,一個(gè)胖子當(dāng)著我的面吹牛夷陋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涯塔,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼清蚀!你這毒婦竟也來(lái)了匕荸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷邪,失蹤者是張志新(化名)和其女友劉穎榛搔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體东揣,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡践惑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘶卧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔觉。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芥吟,靈堂內(nèi)的尸體忽然破棺而出侦铜,到底是詐尸還是另有隱情,我是刑警寧澤钟鸵,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布钉稍,位于F島的核電站,受9級(jí)特大地震影響棺耍,放射性物質(zhì)發(fā)生泄漏贡未。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一蒙袍、第九天 我趴在偏房一處隱蔽的房頂上張望俊卤。 院中可真熱鬧,春花似錦害幅、人聲如沸瘾蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哺哼。三九已至佩抹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間取董,已是汗流浹背棍苹。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茵汰,地道東北人枢里。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹂午,于是被迫代替她去往敵國(guó)和親栏豺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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