Dinic
dinic 求最大流。
先引入兩個概念:層次圖、阻塞流。
層次圖
根據每個點到源點的距離(到達源點最少要經過的邊的數量),將點分層。
如圖:
若level[s]=1,則各點上的數字就是該點的level。
一個bfs就行了。
不難發現,當層次圖中不含有匯點時,就說明沒有流可以流了。
阻塞流
就是一條不考慮反向邊的極大流,每次流完一條阻塞流就一定會去掉一條邊。
然後dinic就是先bfs建個層次圖,然後dfs一層一層傳流量。
爲什麼要這樣?
原因
時間少啊!!!
首先,建層次圖可以判斷是否存在增廣路。
其次,每次增廣時間均不大於點數(層數最多就那麼多)。
然後,dinic每次增廣都可以將其中某一層連向下一層的邊都流滿,所以最多建
最後,dinic還可以進行當前弧優化,進一步壓縮時間。
當前弧優化
在一次DFS中,當某個點所有流出的邊都滿了,就不要再流這個點了。
具體細節看題解代碼:)