1. 程式人生 > >關於上下界網路流

關於上下界網路流

1.無源匯點上下界可行流

一個無源匯點網路流就相當於一個迴圈流,流量在這個迴圈中一直流動,它的最大流就是單位時間的最大流量.

那麼對於無源匯上下界網路流是否有可行解,也就是滿足每個邊的流量都至少是它的下界,並且保證所有點的"流量守恆"就是有解.

那麼我們就想辦法將有上下界轉化為無上下界問題,也就相當於下界為0,那麼轉化為無上下界網路流它的邊的容量就變為(上界值-下界值).如此轉化會造成新的網路沒有"流量守恆",因為我們的轉化就相當於將每個邊都先減去下界的流量,也就是保證了會流出至少下界的流量.

那麼對於一個邊的上下界,令du[i]為(i點的入流量-出流量),邊的入流端j,d[j]加下界值,出流端i,d[i]減去下界值.

建立源點S,匯點T.

如果du[i]>0表示入流大於出流.那麼建立S->i的邊容量為du[i]

如果du[i]<0表示出流大於入流,那麼建立i->T的邊容量為du[i]

那麼對於源點為S,匯點為T的新的網路流跑最大流flow,如果flow==∑du[i]>0,說明對S和T連的額外邊都可以滿流,也就是原圖所有邊都至少有下界的流量時可以滿足"流量守恆".那麼此時無源匯點上下界網路流就有可行解(但是求出的並非最大解(流))

2.有源匯點上下界最大流

首先我們需要判斷有源匯上下界網路流是否有可行流.那麼就需要將有源匯點轉化為無源匯點問題.

①建立匯點T->源點S容量為inf的邊,將有源匯變為無源匯

②建立超級源點SS,超級匯點TT

現在就與無源匯上下界網路流相同,對(SS,TT)跑最大流看是否有解.

如果有可行流,那麼對剛剛建立的匯點T->源點S的邊的反向邊[S->T]的流量就是可行流的流量.

都是此時求出的流量並非最大流,因為前面已經說過無源匯點上下界網路流只求出了可行流並非最大流,所以還要再對殘量網路跑一邊(S->T)的最大流,兩者相加就是了(如果不將建立的T->S的邊刪去,直接跑(S->T)最大流時會加上[S->T]的可行流流量,所以跑完可行流再跑一遍最大流的結果就是答案了).

3.有源匯點上下界最小流.

當然前提依然是要有可行流.

建立超級源點SS,超級匯點TT

第一種方法:

建立T->S的容量為inf的邊.那麼再跑無源匯可行流時要求有源匯點上下界最小流也就是使得[S->T]值儘量小

那麼我們可以先不建立T->S的邊,跑一邊(SS,TT).

然後再加入T->S,在跑一邊(SS,TT)得到[S->T]的值就是最小流了.

可以理解為先不加入T->S邊,現在也就沒有S->T的流量值.

讓其他流量路徑先跑完,之後再加入T->S,就可以把T->S的貢獻減到儘量小.

第二種方法:

跑無源匯上下界可行流求出S->T的流量,那麼最小流一定是小於等於這個值.

之後再跑(T,S)最大流,根據反向邊的性質,(T,S)最大流也就是增加了(S,T)的流量.

所以在跑完可行流的基礎上再跑(T,S)求出再次基礎上還能最多減少多少S->T的流量