2.27 二分圖與網路流複習

LarsWerner發表於2024-03-26

可能會有一些有一點用的 trick 的整理與複習。很少,很不繫統。

1 Dinic 最佳化

  • 給 bfs 和 dfs 加上當前弧最佳化。但是此時要一定注意在遍歷時,\(rest=0\) 退出迴圈需要在迴圈內寫,而非在 for 中的條件寫。

  • 對邊權排序後分段。Dinic 很多時候慢是因為邊權差距太大了。於是我們不斷設一個 \(\lim\),從 \(\max\) 開始,不斷除以一個 \(c\),然後每次加入邊權 \(\ge lim\) 的邊,跑一次 Dinic。在 \(c=2\) 的時候似乎複雜度可證明是 \(O(nm\log )\) 的。但是實際上 \(c\) 大一點反而更快。

  • 先對只加正向邊,然後對所有正向邊跑(注意此時仍然要把反向邊的流量給加上去)。跑完之後再加入所有反向邊跑。

  • 不要使用前向星。

個人認為上述東西不是很有用。如果正常考到應該無法使用上述方法獲得更高的分數。

https://loj.ac/s/2015257

2 二分圖獨立集與覆蓋集

  • 點覆蓋為:用點覆蓋邊

  • 二分圖最大匹配等於最小點覆蓋,下面給出構造:

    1. 找到一組匹配
    2. 找到所有未匹配的左部點
    3. 從它們出發,跑增廣路
    4. 未訪問的左部點與訪問的右部點構成最小點覆蓋
    5. 大概的理解:對於匹配邊兩側恰好只有一個被選,且每條邊都被覆蓋了。
  • 二分圖的最大獨立集,為最小點覆蓋的補集

  • 二分圖的最小邊覆蓋(無孤立點)大小,為最大獨立集大小,下面給出構造:

    1. 所有匹配邊全選
    2. 所有未匹配點隨便選一條邊
  • 最長反鏈與最小鏈覆蓋

    1. 考慮拆點後,out 為左部點,in 為右部點,於是 \(u\to v\) 可以連邊 \((out_u,in_v)\)
    2. 於是在最大匹配上的邊即在鏈上的邊,所以最小鏈覆蓋等於 \(n-\) 最大匹配。
    3. 根據 Dilworth 那套理論,我們求出傳遞閉包後,最長反鏈等於最小鏈覆蓋。構造只要選出 in 與 out 都屬於最大獨立集即可。

3 最小割可行邊與必經邊

  • 時間複雜度十分充裕的時候:每條邊都刪掉/強選跑一跑即可

  • 考慮保留所有容量非 \(0\) 的邊作為殘量網路 \(G'\)

  • 最小割可行邊:原圖滿流,且 \(G'\) 不存在 \(u\to v\) 路徑

  • 最小割必經邊:原圖滿流,且 \(G'\) 存在 \(s\to u\)\(v\to t\) 的路徑

  • 實現方法:對 \(G'\) 跑 SCC,由於逆向邊存在,所以只需要判斷是否在同一 SCC 即可。

4 二分圖博弈

  • 匹配可行邊:為匹配邊,或 \(u,v\) 在同一 SCC

  • 匹配必經邊:為匹配邊,且 \(u,v\) 不在同一 SCC

  • 匹配必經點:為匹配點,且與該部的源不屬於同一 SCC

  • 先手必勝點,一定為匹配必經點:先手只要不斷沿著匹配邊走即可,而後手無法逆轉

5 上下界網路流

  • 大體思路:對於每個點,考慮入邊 \(\sum l_e\) 與出邊 \(\sum r_e\)。如果 \(\sum l_e\) 大,那麼就從新源點 \(S'\) 向這個點連 \(\sum l_e-\sum r_e\) 的邊,否則就連向新匯點。然後就能以 \(r_e-l_e\) 建剩餘的邊了。

  • 無源匯可行流這樣就能跑了,只需要源匯連線的滿流即意味著流量平衡。

  • 有源匯考慮源匯可以不守恆,那麼只需要建一條原匯到原源的 \(\infty\) 的邊即可。

  • 考慮限制最大流。我們在新圖上跑可行流,然後得到殘量網路。由於已經滿足流量限制,所以我們直接再在殘量網路上跑 原源到原匯的流,加到答案上即可。

  • 考慮限制最小流。其實差不多,只不過我們要改成退流,即跑原匯到原源的流,然後從答案中減去即可。

相關文章