PS:如果你覺得你早已入門,可以去提高版看一看
寫在前面的話(潦草)
閱讀體驗:https://zybuluo.com/Junlier/note/1236734
- 這篇博客不會講定義,理解啊什么的,那些知識點網絡上......僅僅是題目詳講
但是每一道題的題解和知識點還是會涵蓋的(筆者做一道更一次)- 建議使用博客右邊的主題切換,換成夜間模式可能看起來更舒服(隨性)
- 筆者根據自己的感受(
也有一定參考性的)給題目編了個難度,有主觀色彩,可以根據實際需要來選擇
前置知識點:
PS:自行與后面的題目最大匹配
一些題目(記得這里是入門版):
PS:若無特殊說明,均為luogu上的題目,難度有標記
網絡最大流/一般增廣路(Dinic&EK)
模板題不講
轉變最小割
- [X] ☆小M的作物(最小割)
- 最大流==最小割
- 顯然這道題所有的收益加起來減掉最小割就是答案
- 考慮建邊:把所有作物向A連一條a[i]的邊,向B了連一條b[i]的邊;集合另開兩個點,一個向A連一條c1[i]的邊,另一個向B連一條c2[i]的邊,最后把兩個點分別向集合內所有點連邊(都是有向邊),暴力跑Dinic就ojbk
- 嗯,用最少的狼堵住路讓所有兔子都過不去......這也太明顯了吧
- 全部堵住——割
- 用最少的狼——最小割
- 最小割==最大流
- 沒錯我們做完了,敲板子去吧(連邊也很**就不多講了)
小專題
為什么要裂點?
可能做網絡流的題目會有疑問,到底什么時候應該把同樣的兩個點拆成兩個來做呢,個人認為這道題可以完美地回答:當你需要以某種方式制約自己但是這種制約又不能通過別人的制約來實現時(很抽象,沒事看題)
- [X] ☆☆教輔的組成(最大流)
- 開始講題:
- 拆點:三種教輔——四列點(中間一樣的兩列(原因見后)),課本肯定放中間(影想兩種)
- 建圖:
①源點向第一列所有點連邊,第四列所有點向匯點連邊(容量肯定是1啊)
②課本第二列和第三列連容量為1的邊,看那些書有聯系確定就連邊
③為什么課本一定要列成兩列點呢?嗯,首先課本只能用一次對吧,但是只能用一次又不能通過練習冊和答案書來連邊決定(看着上面那段話),所以我們只能考慮自己與自己連一條容量為1的邊來保證只用一次了......- Dinic跑一遍OK
- 現在應該理解那段話的意思了吧!嗯,
這些都是很妙的思(tao)想(lu)
帶點小小小技(困)巧(難)
- [X] ☆☆蜥蜴(最大流)
想到方法並不難
- 拆點(先別問為什么......):把矩陣都變成點,變成兩列點
- 怎么建圖:
- ① 把源點向初始有蜥蜴的地方連邊(當然費用為1);把能跳出去的有柱子的地方向匯點連邊(好吧前面都是廢話,誰都知道)
- ② 考慮題目說從哪根柱子離開才有損害,所以拆點成兩列的作用出來了,(先別疑問為什么,自然懂),從自己向另一列點的自己連邊,然后考慮可以跳到的點,從第二列的那個點向第一列的自己連邊,原因就是因為要保證從這里出去一定要減流量還不能損害到別的柱子(有點抽象,自己思考一下,真的不難的)
- 最大流板子
介紹兩種方法(因為我們學信息又不是只會網絡流就行了Q_Q)
- 第一種——貪心
- 看到題目第一眼有沒有一種感覺,能放就放!
- 具體來說就是我放在之前的管子上面總會比新開一個管子放球更優,所以直接枚舉所有已經放過的管子,看是否可以放下,放不了就新開管子放....
很簡單吧- 啥?你問我證明?
cjoier
告訴你:大膽猜想,不用證明,證明就是你再寫個dfs拍一下個數就行了。。。溜了溜了
- 第二種——網絡流
首先我們考慮如何建圖,即表達相鄰球之間的關系。
- 首先一個不難想到的東西:柱子數一定關於球數單調遞增。
- 可以將一個球拆點為A和B,先從源點S向A連容量為1的邊,從B向匯點連容量為1的邊。
- 對於能夠與i和為完全平方數的球j,連接Aj和Bi來體現出它們可以在一個管子里相鄰
- 不停地加球:球數每增加1就建立新加入的球的關系,並且重復地跑最大流。
我們這樣可以求出某一柱子數下最多能放置的球數,因為當新加入的球能夠加入柱子時,重復跑最大流是能得到新流(該球可與其他球構成新的相鄰關系)的,只要一直能得到新流,就說明柱子上還可以再加。- 不停加柱子:跑完所有的柱子就到答案了。
當有一次得不到新流,就說明柱子滿了,新加入的球並沒能加入到任何一個柱子上。此時我們就加柱子(從源點引流到這個球上)。直到柱子加到超過n,此時的球數-1就是最大球數(因為此時實際上柱子加到超過n了)。- 考慮輸出答案:①記下第一個加入柱子的球。②在DFS得到增廣路的過程中,總是記下該點連接的下一個點的球的編號,形成類似鏈表的結構。③輸出再取出第一個加入柱子的球,來遍歷它所在的那條鏈。(和前面的那題最短路徑覆蓋差不多)
二分圖匹配(匈牙利)
基本都是板子(笑哭.jpg)
- 是不是二分圖匹配的題目都這么裸(jian dan)
- 連邊代表i可以睡j+n的床,然后暴力跑匈牙利
- 幾個值得注(fei)意(hua)的地方:
- 我不在學校住就不能去占床位(不往外連邊)
- 我是外校的就沒有初始床位......
- 這個題是多組數據,記得初(bie)始(nao)化(can)......(我還因此爆了一次0......)
費用流
個人認為費用流都有些難度(雖然這里是入門版)
- [X] ☆☆負載平衡問題(網絡流24題)
- 這道題顯然可以當均分紙牌加強版來貪心nlogn做,這里就不詳講了(洛谷的題解第一篇的講的挺好,
雖然標簽是網絡流)- 好了,網絡流的做法,雖然沒有貪心優秀,但是可以練網絡流嘛
- 首先運輸完之后肯定每個地方值都為開始各個地方的平均數對吧(又沒有運到別的地方去......),那么我們直接拿原來的值減掉平均數變成一串有正有負的數
- 顯然正負的意義是是否運出去(放到網絡流里:正就是源點多給了我,我要送走(建邊跑啊),負就是得多給匯點一些東西保證收支平衡對吧,
顯然)- 完了,這就上面一講也沒什么好寫的了,邊都建完了......//滑稽
- 開始暴力跑最小費用最大流......沒了
- [X] ☆☆晨跑
- 首先
一眼看出不就是個最小費用最大流嗎- 連邊和前面的蜥蜴有點像:①先把除1,n之外的點裂成兩個,再自己和另一列的自己連;②如果兩點u,v有道路,則把第二列的u連向v(理由也和蜥蜴一樣);③如果和1有邊,則從1連過來(n同理)
- 所以再套個板子就ojbk了(
1-->n
的情況就直接連,不用多想)
- [X] ☆☆☆海機器人問題(網絡流24題)
- 看到數據范圍這么小,但又不能暴力搞,看這一個標本只能被采一次,
不是典型的網絡流題目嗎,標本有費用?那就最大費用最大流(名字瞎編的)- 網絡流最難的地方:建圖
* 考慮矩陣中的點只能往兩個方向動,且有收益(費用),肯定要連邊,所以輸入的時候就把這些邊全部連起來,需要注意:①輸入的方法有些毒瘤;②一個點可以經過多次,但費用只可以被使用一次,那么先連一條容量為1,費用為收益的邊,再連一條容量Inf,費用為0的邊,顯然可以解決這個問題;③第二次南北方向的收益的輸入,邊連的點之間相差的是Q是(因為是上下)
* 然后只有a個點有一些機器人進來,b個點有一些機器人出去,所以(這個不難)把源點與那a個點連邊,容量為進入的機器人數(b那邊連邊類推)
- 很高興地告訴你,剩下的只有板子了(
這不廢話),但別忘了SPFA跑最長路,因為是求最大收益(費用),或者可以把費用手動改成負然后跑最短路,最后再負回來就行了。- 可以看看代碼......
總結
這里為剛入網絡流
這個坑的同學們總結一下
- 網絡流中最大流是考的最多的,但往往也是比較容易想到的(
放狗屁),雖然有些題目它的正解建邊十分復雜難想,但是是相對而言的- 其次考的多的就是費用流了,復雜多樣,各種花里胡哨的考法,反正抓住一點:圖建出來了其他都不是事(
又在天真了),對,沒錯,網絡流的所有難點就只有建邊了(對大多數人而言//鄙夷)- 至於二分圖,它本身就是最大流的一個特殊版本,其實我們根本不必把它放進來......基本都比較水吧。。。
那么如果上面的題目實在是太水了,可以前往我的網絡流題目詳講提高版看看