關於網路流

你的小垃圾發表於2022-03-28

流網路:是一個有向圖(可以有環),有兩個特殊的點:一個是源點(出發點),一個是匯點,每條邊都有屬性,叫做容量(也就是每條邊的權),

可以想象成一條河,每個點就是一個彙集處,邊的容量就是一段的流量。

對於反向邊,可以在中間加一個點,所以我們可以預設成不存在反向邊

如果邊不存在,那容量就是0;

可行流(f),從源點流出如果滿足2個條件就是可行流:1容量限制  2流量守恆(對於每個點,流進多少,就流出多少)

可行流流量值(|f|)=往外流的流量 - 流回來的流量(這裡考慮了反向邊,但基本上是不需要考慮的)

最大流:即最大的可行流

殘留網路:針對流網路的某一條可行流而言,每個可行流都對應唯一的殘留網路(Gf)

殘留網路的點集就是原網路的點集,邊集包括原網路的所有邊,和所有反向邊,

殘留邊的容量有兩種情況

對於非反向邊,也就是圖裡的邊,就是他還沒有用掉的容量值,啥意思??不是說每條邊都有一個最大流量嗎,那殘留網路的邊值就是最大流量減去原流量

對於反向邊,就是這條邊能退回去多少流量,那也就是這條邊的原流量

那為啥要定義這個反向邊呢??對於任意一個點你可以選擇走或者是不走,但是你走著走著就發現這條路不是最優解,那你就後悔了於是要返回,返回的流量就是原來流出的流量!!

原網路的可行流(f)和殘留網路可行流(f’)有啥關係?

f+f’也是原網路的一個可行流。

證明:那就看是否滿足容量限制和流量守恆

分類討論:如果這兩條邊的方向是相同的,我們知道殘留的最大值就是c(最大容量)-f,也就是說: 0<=f'<=c-f,而原網路的的範圍是 0<=f<=c,所以相加的範圍就是:0<f+f'<=c,那他們就不會超限制,所以滿足容量限制

如果方向不同,那又退回來一些,所以肯定不會超過限制:即:c(u,v)>=f(u,v)+f'(v,u)>=0

第二點就是流量守恆:

               

 

那我們可以看出來,反正兩邊總和是相同的,那就算是相減(反向)還是相加(正向),等號依舊是成立的

就好比 a=b , c=d  => a+c=b+d , a-c=b-d

那這個可行流的流量怎麼算?

| f + f' | = | f | + | f' |

得到性質:任何一個殘留網路的大於零可行流都可以增加原網路裡的可行流

換句話說,如果一個殘留網路裡沒有了大於零的可行流,那原網路的可行流就一定是最大的

 

增廣路徑:

殘留網路裡,從源點出發,沿著容量大於零的邊,如果能走到終點的話,這條路徑就是一條增廣路徑(一般不考慮環)

那由定義得,增廣路徑一定是一條可行流,有何用處?

 

割:

將點構成的集合V分成兩部分:S和T,要求:S∪T=V,S∩T=∅,而且源點s∈S,匯點 t∈T。

那這個劃分的結果就是一個

1、割的容量:所有從S集合指向T集合的邊的容量值和(順序不能換),c(S,T)=

 最小割:割的最小容量

2.割的流量:從S指向T的流量-從T指向S的流量,即:

那就有以下性質:對於任意一個割,割的流量一定小於等於割的容量,即

 

證明:其實就是考慮不能超過最大流唄

 

         

        

        

還有,就是我們剛才不是得出了:可行流流量值(|f|)=往外流的流量 - 流回來的流量,那也就是:

那我們再進階一下:

這個就很好理解了對吧,感性理解一下吧 

那現在有個大問題:就是|f|與f(S,T)之間的關係:

來證明一下吧!

$\because   S\cup T = V,S\cap T = \phi$

$\therefore  f(S,V)=f(S,S)+f(S,T)=0+f(S,T)$

$\therefore f(S,T)=f(S,V)=f(s,V)+f(S-s,V)$

$\because t\notin S,s\notin S-s$
$\therefore t,s\notin S-s$
$設S'=S-s$
$\therefore S'是一個不包括匯點源點的集合,他一定滿足流量守恆$
$\therefore f(S',V)=\sum_{u\in S'}^{}\sum_{v\in V}^{}f(u,v)- \sum_{u\in S'}^{}\sum_{v\in V}^{}f(v,u)$
$=\sum_{u\in S'}^{}(\sum_{v\in V}^{}f(u,v)-\sum_{v\in V}^{}f(v,u)$
$=\sum_{u\in S'}^{}(0)$
$=0$
$\therefore f(S,T)=f(s,T)$
$由定義得:f(s,V)=|f|$
$\therefore f(S,T)=|f|$

其實要是是在理解不了(比如我),那就感性理解一下吧!

當然,還有另一種非常簡單的解法(LaTeX在部落格園上太太太醜了,所以還是換回來了那個字型):

 

 

$=\sum_{s\in S}^{}\sum_{v\in V}^{}f(s,v)-\sum_{s\in S}^{}\sum_{v\in V}^{}f(v,s)+\sum_{v\in V}^{}\sum_{u\in S/ \left\{ s \right\}}^{}f(u,v)-\sum_{v\in V}^{}\sum_{u\in S/ \left\{ s \right\}}^{}f(v,u)$

然後找到有相同的項的併合並,一約就發現有等於0的部分,然後就OK啦!!!但是由於本蒟蒻精力有限,剩下的證明就不再贅述,請諒解(其實是因為打這玩意真真真太麻煩了)

所以我們得出:

 即:最大流<=最小割 

下面開始進入核心部分:

關於最大流最小割定定理:

最大流=最小割

首先我們需要知道的是,對於某一個流網路來說:1可行流f是最大流 <=>  2可行流f的殘留網路中不包括增廣路 <=> 3存在某一個割,使得可行流的流量=割的容量

如何證明?

首先,如果 f 是最大流,而且殘留網路中還有增廣路,那麼 f 肯定還能加,那 f 就不是最大流了,與前面假設矛盾,所以 1=>2,也就是說如果f是最大流,那f的殘留網路一定不包括增廣路。

其次,如果有一條可行流,他的流量等於割的容量,假設他不是最大流,那就會存在一條比他大的最大流,那這條最大流的流量一定大於割的容量,由於容量限制,這種情況是肯定不會發生的,所以如果存在一個割,他的容量等於一條可行流的流量,那麼這條可行流一定是最大流,所以3=>1,搞定!

最後,將S集合定義為在殘留網路中,從s(源點)出發,沿著容量大於0的可行流走,所有能走到的點,T=V - S,這就是一個合法的割,那麼,設f(x,y)<c(x,y),那麼c(x,y)-f(x,y),也就是殘留網路中的容量f'(x,y)就大於零,那也就說y這個點能從x這個點遍歷到的,那麼y就應該屬於S,與原假設矛盾,所以f(x,y)=c(x,y),那麼對於任意的反向邊一定等於0。此時我們得出,

我們還可以更深一層的發現:

由於可行流一定小於等於割的容量,對於任意的割和流這都是滿足的(前提是這個割是可行的),所以我們可以得出:最大流小於等於最小割

又因為最小割<=某一個割的容量c(S,T)=|f|<=最大流,所以最大流大於等於最小割

所以最大流等於最小割

 

演算法:給定流網路,維護殘留網路

每次迭代,現在殘留網路裡找增廣路(也就是找一條從頭到尾的路徑),也就是BFS。之後更新殘留網路,就是讓原來的殘留網路Gf變成Gf+f'。咋更新?舉個例子吧!

假設我現在有一條正向邊和一條反向邊,設正向邊容量為c1,反向邊的流量是c2,假設我現在流進了k個單位的流量,那麼正向可以流的流量就更新成c1-k,讓反向變成c2+k。

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章