1. 程式人生 > >網路流建圖技巧

網路流建圖技巧

上下界問題

無源匯上下界求有無可行流

另取兩個附加匯點xx,附件源點yy.

u->v限制[L,R] <=> 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的流量儘可能小)

一般技巧

  1. 如果一個點的經過有時間的先後順序,那麼我們可以利用圖的有向性,和時間的有向性,來將其結合起來,將其擴大時間的點數。
  2. 在已給了一些匹配後,需要我們根據一給出的圖給出最少修改次數,此時,就需要我們對原來一些匹配給出優化,就是在相同情況下給出優待,那麼怎麼給呢,將圖的權值擴充為原來最多點數的倍數,而以給出的匹配,我們就在額外將其權值加一,此時,最後得到的最大匹配和再最總點數取餘即可得到原來的邊數,而將總期望數除以總點數取整,就原有的值。
  3. 雙向圖時,可以少建反邊。