memset的乙個用法:
memset(0x3f)也可以近似的填充出乙個inf,是1e9的數量級(1061109567),而且可以滿足加上乙個數值(1e9)後仍然是int。具體參見部落格 memset函式詳解
最大流的三個演算法:樸素ff演算法、ek演算法、dinic演算法
參見部落格 網路流基礎
dinic演算法可以說是樸素ff和ek演算法的優化產品,在一次bfs下進行多次dfs以降低時間複雜度。據此,我們優先使用dinic演算法。
核心**部分:
bool bfs(int s,int t)//bfs功能和ek演算法的相似,不同的是dinic中的bfs要求出所有點到源點s的最短路dis[i]}}
return dis[t]!=-1;
}int dfs(int x,int t,int maxflow)//表示從x出發尋找到匯點t的增廣路,尋找到maxflow流量為止,並相應的增廣。返回值為實際增廣了多少(因為有可能找不到maxflow流量的增廣路)
return ans;
}int dinic(int s,int t)
有一些值得注意的地方:
網路流問題中的反向弧為dfs提供了反悔的機會,類似於向量的抵消,讓流量可以從上乙個結點重新流動。
bfs中清空佇列的手法值得一學。
在dfs的引數中,maxflow表示的是當前結點x最多可以獲得的流量,而在函式體中的f用來儲存每乙個鄰點需求的流量,ans表示在maxflow約束下可以增廣的流量總和。可以肯定的是,ans >= maxflow的時候,再往後的討論已經沒有意義了,從而continue即可。自然地,dfs開始時maxflow應該是inf。
在洛谷上做到了乙個二分匹配的題目 飛行員匹配問題
由於反向弧具有抵消之前流的功用,我們最後只需要遍歷所有的反向邊,檢查它的權值是不是1即可。
更一般地說,具有正權值的反向弧實則就是記錄了最大流的路徑問題。
費用流
推薦兩篇部落格:
(該系列還包含了有上下限的最大流)
核心**:
struct prepre[m<<1];
bool spfa(int s,int t)}}
}return dis[t]!=inf;
}void mcmf(int s,int t,int &maxflow,int &mincost)
maxflow+=minv[t];
mincost+=minv[t]*dis[t];
}}
kuangbin網路流
a
第乙個沒有參考別的**自己寫出來的dinic演算法,同時也實踐了一下反向弧求路徑。但是非常不幸的是,這道題不能直接用最大流做,需要用到乙個叫做拆點的方法。我們注意到,一般的最大流問題是在邊上對流量有限制,流經某條邊的流量不能超過其容積;但是這道題不是對邊上的限制,而是對結點本身的限制(某個機器生產的零件總值是乙個給定值)。開始重新dfs學習新知識點
參見kuangbin本人部落格 poj 3436 acm computer factory(最大流)
2019暑訓8月14號 數論
重要的數論函式 n 1 n id n n n n dirichlet卷積 dirichlet 卷積學習筆記 露迭月 感覺這篇部落格講的比較通透 系統。由此還尋找到了另一篇講的很好的dirichlet卷積的部落格 鈴懸的數學小講堂 狄利克雷卷積與莫比烏斯反演 事實上,單從mobius的表示式來看它實在...
PAT 甲級 2023年9月8號 題解
第一題 dfs 剪枝 k位數不能所有的數字都遍歷一遍,必須有選擇的。選擇k位數和為m的。remain為剩下未分配數的位置的和。remain必須小於等於剩下的位數 9。因為若是大於的話,剩下的所有位數都為9,都滿足不了所有位加起來為m。比如k 3,m 20,如果第一位為1,則return。因為無論後面...
2023年8月5號 暑假訓練周天總結
剛剛整理完組合數學的內容,周天只剩下夜生活了。這週很累呀,真是跟最後幾天期末複習的樣子,每一天三點一線,天天死磕數學證明與定理,一直在吸收,現在回想起來腦仁都疼,兩本書就這麼被我看完了。但學習的效率沒得說,真是,人的潛能是被逼出來的,要放在平常,估計一章都看不完,所以,這種模式,讓我知道了什麼是集訓...