可能會有一些有一點用的 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 二分圖獨立集與覆蓋集
-
點覆蓋為:用點覆蓋邊
-
二分圖最大匹配等於最小點覆蓋,下面給出構造:
- 找到一組匹配
- 找到所有未匹配的左部點
- 從它們出發,跑增廣路
- 未訪問的左部點與訪問的右部點構成最小點覆蓋
- 大概的理解:對於匹配邊兩側恰好只有一個被選,且每條邊都被覆蓋了。
-
二分圖的最大獨立集,為最小點覆蓋的補集
-
二分圖的最小邊覆蓋(無孤立點)大小,為最大獨立集大小,下面給出構造:
- 所有匹配邊全選
- 所有未匹配點隨便選一條邊
-
最長反鏈與最小鏈覆蓋
- 考慮拆點後,out 為左部點,in 為右部點,於是 \(u\to v\) 可以連邊 \((out_u,in_v)\)
- 於是在最大匹配上的邊即在鏈上的邊,所以最小鏈覆蓋等於 \(n-\) 最大匹配。
- 根據 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\) 的邊即可。
-
考慮限制最大流。我們在新圖上跑可行流,然後得到殘量網路。由於已經滿足流量限制,所以我們直接再在殘量網路上跑 原源到原匯的流,加到答案上即可。
-
考慮限制最小流。其實差不多,只不過我們要改成退流,即跑原匯到原源的流,然後從答案中減去即可。