網路流建圖技巧
阿新 • • 發佈:2018-12-09
上下界問題
無源匯上下界求有無可行流
另取兩個附加匯點xx,附件源點yy.
u->v限制 <=>
add_edge(u,xx,L),add_edge(yy,v,L),add_edge(u,v,R-L)
最後只需跑一遍 max_flow(yy,xx)檢驗與yy相連線的邊是否滿流即可
有源匯上下界求有無可行流時,只需在無源基礎上加上 add_edge(t,s,INF)
有源匯上下界求最大流
第一種
- 連上t->s流量為inf的邊,求一次附加源到附加匯的最大流
- 在殘量網路上求一次s到t的最大流
- 最後答案就是第二次求出的最大流(因為第一次求出的最大流是t->s的流量,而這個流量在他的反向邊s->t中出現,所以不需要另外加上)
- 為什麼這樣做呢?
- 依然感性的理解,第一次求出的(附加源到附加匯的)最大流是為了滿足down儘可能流滿,然而此時s->t上可能還有可行的流,我們在殘量網路上繼續來求最大流,可以使得最後求出的流既滿足≥down的限制,且最大。
第二種更易理解
就是將res = t->s流量,將最後一條邊刪除或cap賦值為零。加上跑一遍s->t的最大流。
有源匯上下界求最小流時
- 先不要連線t->s流量為inf的邊,求一次最大流
- 再連上t->s流量為inf的邊,在殘量網路上求一次最大流
- 為什麼這樣做呢?
- 感性的來理解,第一步中求最大流,所有能流的邊都“竭盡全力”的流完了; 第二步再求最大流的時候,t->s上的流量就會盡可能的小(即s->t的流量儘可能小)
一般技巧
- 如果一個點的經過有時間的先後順序,那麼我們可以利用圖的有向性,和時間的有向性,來將其結合起來,將其擴大時間的點數。
- 在已給了一些匹配後,需要我們根據一給出的圖給出最少修改次數,此時,就需要我們對原來一些匹配給出優化,就是在相同情況下給出優待,那麼怎麼給呢,將圖的權值擴充為原來最多點數的倍數,而以給出的匹配,我們就在額外將其權值加一,此時,最後得到的最大匹配和再最總點數取餘即可得到原來的邊數,而將總期望數除以總點數取整,就原有的值。
- 雙向圖時,可以少建反邊。