1. 程式人生 > >有上下界網絡流學習筆記

有上下界網絡流學習筆記

方法 存在 原來 最大流 一個 流量 code 有上下界網絡流 zoj

有上下界網絡流學習筆記

1.有(無)源匯有上下界最小費用可行流:算法的核心思想是補流。先判斷原圖是否有源匯,若有則連邊\(t \to s(\infty/0)\);隨後新建超級源匯\(S\)\(T\);然後對於每一條邊\(x \to y\),連邊\(x \to y(high-low/w)\);接著對每一個點\(x\),計\(\delta\)為該點入邊流量下界之和減去該點出邊流量下界之和,如果\(\delta\)為正數,說明接下來有一部分流量要從\(x\)流出,則連邊\(S \to x(\delta/0)\);若\(\delta\)為負數,說明需要有一部分流量流入\(x\),則連邊\(x \to T(-\delta/0)\)

,最後做費用流在加上必須流的費用即可。

例1.Luogu4043 支線劇情

模板題,沒啥好說的。

2.無源匯有上下界可行流:算法的核心是先建出初始流,再通過補充附加流,滿足流量平衡(其實和1是一樣的)。建立附加源匯\(S\)\(T\),然後對於每一條邊\(x \to y\),連邊\(x \to y(high-low)\);接著對每一個點\(x\),計\(\delta\)為該點入邊流量下界之和減去該點出邊流量下界之和,如果\(\delta\)為正數,說明接下來有一部分流量要從\(x\)流出,則連邊\(S \to x(\delta)\);若\(\delta\)為負數,說明需要有一部分流量流入\(x\)

,則連邊\(x \to T(-\delta)\)。如果我們能夠找到使後面所有附加上的邊都滿流的方案,那麽我們就得到了可行流,所以對新圖做最大流即可。若存在方案,那麽最後每條邊的流量為最大流中的流量加上原圖中的流量下界。

例2.ZOJ2314

仍然是模板題。

3.有源匯有上下界最小/最大流:連邊\(t \to s(\infty)\),先用2中所述方法求出可行流,然後刪去\(t \to s(\infty)\),從\(s\)\(t\)在原來的殘量網絡上增廣即可得到最大流,因為這樣既不破壞流量平衡,又不會不符合上下界,同時最大化了流量;最小流有兩種做法:1.因為反向邊的流量增加就是正向邊的流量減小,最小流是正向邊流量最小化,所以\(s \to t\)

最小流就是反向邊流量最大化,即\(t \to s\)最大流,反過來增廣即可。2.(這個做法我也不是很明白,如果有大佬知道原因,希望能給我講解一下)先求超級源匯的最大流,然後連邊\(t \to s(\infty)\),繼續增廣求超級源匯的最大流,答案即為新邊\(t \to s(\infty)\)的實際流量,因為第一次增廣時流量已經盡量往其他邊流,那麽加上這條新邊後,就盡可能減小了最終答案。

例3.BZOJ2502

還有一些練習題,等我寫了再貼在這吧。

有上下界網絡流學習筆記