人人都要學演算法 網路流演算法遠比你想的要好玩

2021-07-07 06:11:56 字數 2359 閱讀 6217

這個問題的由來是想起來明天將會有國足世預賽的比賽,於是今天去看了看國足目前在小組中的積分。在積分榜中,我們可以看到與中國同組的馬爾地夫和不丹都已經沒有了出線的機會,即使他們剩餘的比賽全勝也不可能出線了。我在想,有沒有乙個通用的方法,可以算出各支隊還有沒有出現的可能。

現在我們來回歸正題:

其實網路流沒有那麼複雜,我們來用交通網示意圖來舉個例子:

我們來看這個交通網示意圖,假設 s 為入口,t 為出口,圖中的單向箭頭表示從乙個地方到另乙個地方的可允許通過的方向,箭頭上的數字表示該路線所能承載的最大的車流量(例如:a,b 兩點,只能從 a 地到 b 地,並且該路線同時只能有4輛車同時通過)

我們需要解決的乙個問題是如何安排好車的流量,例如現在有6輛車進入入口,我們可以如下圖這樣安排車的流量:

從圖中我們可以看出來各個路線的最大承載量與當前的車流量,如上圖的情況,我們說它是安全的。只要每乙個地點它的駛入量與駛出量是相等的,我們就可以說它是安全的。另外,對於這個問題,我們會發現有的路線會是乙個環(a->b->c->a),我們暫且不考慮這個問題,我們只關注當前的交通系統是安全的,至於有的車可能一直在繞圈圈我們不會去考慮。

現在又出現了乙個新的問題:現在的交通實際車流量並沒有達到最大,似乎還能增大 s 點的駛入量,這時我們可以再尋找一條從 s 到 t 的路經:s->a->b->c->t。把每條路徑的實際流量加1,我們會發現情況依舊是安全的,此時的駛入量為7:

現在實際交通流量達到最大了嗎?這次好像沒有那麼容易看出來了。我們來看一下這條路經:s->b->a->c->t,我們看到這條路經並不是完全順著我們的路線的,只有 s->b 和 c->t 是順著路線的,b->a 和 a->c 是逆著路線的。我們把順著的路線流量都+1,把逆著的路線流量都-1,我們得到了下面的圖:

此時,我們看這個圖,它依舊是安全的,並且流量增加了1,現在駛入量是8。

現在我們得到了兩種方式可以增大網路流流量的方法:

我們把這兩種路徑叫做增廣路徑,如果我們不能在圖中找到任何增廣路徑,那麼我們就說它以及達到了最大流量。

現在,我們想想如何用網路流的模型來解決一支隊是否有奪得第一名的可能。

現在我們來假設一種比賽,共有若干支隊伍,互相之間要進行多場比賽,其中的5只隊伍勝負情況如下表(其中 a 為聯賽第一名,e 為聯賽最後一名):

team勝負

剩餘a755928b

726228c

696627d

607527e

498627

剩餘比賽的狀況如下表:

teamab

cdea038

73b302

74c820

00d770

00e340

00我們現在考慮 e 隊還有沒有機會奪冠,也就是說在最好的情況下 e 能不能奪得第一名,即在剩下的比賽中 e 獲得全勝。

現在我們考慮 e 如何才能奪得冠軍,我們可以看到 e 還剩下27場比賽,如果它全勝的話,最後的勝局數量將會是49+27=76,那麼也就是說,若使 e 保留奪冠可能,a 最多還能贏1場,b 最多還能贏4場,c 最多能贏7場,d 最多能贏16場

現在我們來看看賽程,a、b 直接還有3場比賽,a、c 之間還有8場比賽,a、d 之間還有7場比賽,b、c 之間還有2場比賽,b、d之間還有7場比賽

我們把上述情況總結成乙個網路流圖:

我們來解釋下這乙個圖:

從 s 點出發的路線表示某兩隻隊之間的剩餘比賽數,到 t 點的路線表示某隊最多能贏的場數。例如,我們設定了乙個 a-b 結點,然後從 s 引出一條道路指向這個結點,並將其最大流量設定為 3 ;再從這個結點出發,引出兩條道路,分別指向 a 和 b ,其最大流量可以均設為 3 ,或者任意比 3 大的值(一般設為無窮大,以表示無需限制)。因而,在乙個網路流中,結點 a-b 將會從源點 s 處獲得最多 3 個單位的流量,並將所得的流量再分給結點 a 和結點 b 。如果把每個單位的流量理解成乙個乙個的勝局,那麼網路流也就可以理解為這些勝局的**和去向。類似的我們有 a-b,a-c,a-d,b-c,b-d 五個結點。因此這個圖中的任意乙個合法的網路流都表示一種比賽結果

因此,現在如果我們能使該圖的最大流量到達27,那麼我們就可以合理的安排比賽,使得每支隊伍都不超過所能允許的最多生理場次。

現在圖中的最大流量是26,我們看看還能不能增加乙個流量,即找到乙個增廣路徑(圖中 n 表示無窮大):

很顯然,我們在圖中找不到另外的增廣路徑了,因此該圖的最大流量為26,因此,e 隊不論多麼努力,他們都將會與冠軍無緣~

Edmonds Karp演算法,網路流最大流

網路流是一種生活中常見的圖模型,包含乙個起始點,和乙個匯點,以及若干結點,用有向邊連線,每條邊的權值代表能流經該邊的最大流量。生活中,水流網路,電流網路,資訊網路這些問題都能描述成網路流。網路流中一種常見的問題是最大流問題。即求從起始點到達匯點流的最大值。在 演算法導論 介紹了edmonds kar...

Edmonds Karp演算法 網路流 最大流問題

可行流 即多條弧的集合,且每條弧的流量為非負的,且不超過該弧的容量 流入原點的流量等於流出終點的流量。最大流 即網路中的流量最大的可行流。最大流的求法 即由原網路得到殘量網路,再找到殘量網路中的增廣路,根據增廣路求最大流。步驟 1.找到殘量網路中的一條增廣路。2.求出該增廣路上的最小的流量值,使各個...

我的dinic演算法網路流(詳註解)

題目大意 求乙個圖中起點s到終點t的最大流除以s到t的的所有路徑中的最大流量的那條路徑流量值 雖然這樣看起來比較簡單,但說實話,這題我讀題至少都花了半個小時,直到ac的的前一秒我都有點怕題意讀錯 此題主要要求兩個量 整個圖的最大流和一路徑的最大流量值 最大流maxflow沒什麼好說的,直接套模板 不...