網路流題目詳講+題單(入門版)(持續更新中......)
阿新 • • 發佈:2019-01-31
PS:如果你覺得你早已入門,可以去提高版看一看
寫在前面的話(潦草)
- 這篇部落格不會講定義,理解啊什麼的,那些知識點網路上......僅僅是題目詳講
但是每一道題的題解和知識點還是會涵蓋的(筆者做一道更一次)- 建議使用部落格右邊的主題切換,換成夜間模式可能看起來更舒服(隨性)
- 筆者根據自己的感受(
也有一定參考性的)給題目編了個難度,有主觀色彩,可以根據實際需要來選擇
前置知識點:
PS:自行與後面的題目最大匹配
- ☆當前弧優化了解一下謝謝(
不難,只是需要程式碼我就不想講)- ☆☆最大權閉合子圖(
定義自己找)==正權點和-最小割(最大流)
一些題目(記得這裡是入門版):
PS:若無特殊說明,均為luogu上的題目,難度有標記
網路最大流/一般增廣路(Dinic&EK)
模板題不講
轉變最小割
[X] ☆小M的作物(最小割)
- 最大流==最小割
- 顯然這道題所有的收益加起來減掉最小割就是答案
- 考慮建邊:把所有作物向A連一條a[i]的邊,向B了連一條b[i]的邊;集合另開兩個點,一個向A連一條c1[i]的邊,另一個向B連一條c2[i]的邊,最後把兩個點分別向集合內所有點連邊(都是有向邊),暴力跑Dinic就ojbk
[X] ☆奶牛的電信(最小割)(注意一下這裡的最小割是點)
[X] ☆狼抓兔子
嗯,用最少的狼堵住路讓所有兔子都過不去......這也太明顯了吧
- 全部堵住——割
- 用最少的狼——最小割
- 最小割==最大流
沒錯我們做完了,敲板子去吧(連邊也很**就不多講了)
小專題
為什麼要裂點?
可能做網路流的題目會有疑問,到底什麼時候應該把同樣的兩個點拆成兩個來做呢,個人認為這道題可以完美地回答:當你需要以某種方式制約自己但是這種制約又不能通過別人的制約來實現時(很抽象,沒事看題)
[X] ☆☆教輔的組成(最大流)
- 開始講題:
- 拆點:三種教輔——四列點(中間一樣的兩列(原因見後)),課本肯定放中間(影想兩種)
- 建圖:
①源點向第一列所有點連邊,第四列所有點向匯點連邊(容量肯定是1啊)
②課本第二列和第三列連容量為1的邊,看那些書有聯絡確定就連邊
③為什麼課本一定要列成兩列點呢? - Dinic跑一遍OK
- 現在應該理解那段話的意思了吧!嗯,
這些都是很妙的思(tao)想(lu)
[X] ☆☆酒店之王
- 和教輔的組成基本一模一樣(就連邊的輸入有一點差別),所以就不多講了......
[X] ☆☆吃飯
- 也是相當簡單,我只是把這類題放一起而已
帶點小小小技(困)巧(難)
[X] ☆☆蜥蜴(最大流)
想到方法並不難
- 拆點(先別問為什麼......):把矩陣都變成點,變成兩列點
怎麼建圖:
- ① 把源點向初始有蜥蜴的地方連邊(當然費用為1);把能跳出去的有柱子的地方向匯點連邊(好吧前面都是廢話,誰都知道)
- ② 考慮題目說從哪根柱子離開才有損害,所以拆點成兩列的作用出來了,(先別疑問為什麼,自然懂),從自己向另一列點的自己連邊,然後考慮可以跳到的點,從第二列的那個點向第一列的自己連邊,原因就是因為要保證從這裡出去一定要減流量還不能損害到別的柱子(有點抽象,自己思考一下,真的不難的)
最大流板子
[X] ☆☆地震損失2
- 不難,網路流的正常套路跑最小割(自己連自己,其餘按邊連)
- 注意處理一下報告的地方流量正無窮,其餘流量為1
[X] ☆☆魔術球問題(網路流24題)(貪心/最大流)
介紹兩種方法(因為我們學資訊又不是隻會網路流就行了Q_Q)
- 第一種——貪心
- 看到題目第一眼有沒有一種感覺,能放就放!
- 具體來說就是我放在之前的管子上面總會比新開一個管子放球更優,所以直接列舉所有已經放過的管子,看是否可以放下,放不了就新開管子放....
很簡單吧 - 啥?你問我證明?
cjoier
告訴你:大膽猜想,不用證明,證明就是你再寫個dfs拍一下個數就行了。。。溜了溜了
- 第二種——網路流
首先我們考慮如何建圖,即表達相鄰球之間的關係。
- 首先一個不難想到的東西:柱子數一定關於球數單調遞增。
- 可以將一個球拆點為A和B,先從源點S向A連容量為1的邊,從B向匯點連容量為1的邊。
- 對於能夠與i和為完全平方數的球j,連線Aj和Bi來體現出它們可以在一個管子裡相鄰
- 不停地加球:球數每增加1就建立新加入的球的關係,並且重複地跑最大流。
我們這樣可以求出某一柱子數下最多能放置的球數,因為當新加入的球能夠加入柱子時,重複跑最大流是能得到新流(該球可與其他球構成新的相鄰關係)的,只要一直能得到新流,就說明柱子上還可以再加。 - 不停加柱子:跑完所有的柱子就到答案了。
當有一次得不到新流,就說明柱子滿了,新加入的球並沒能加入到任何一個柱子上。此時我們就加柱子(從源點引流到這個球上)。直到柱子加到超過n,此時的球數-1就是最大球數(因為此時實際上柱子加到超過n了)。 - 考慮輸出答案:①記下第一個加入柱子的球。②在DFS得到增廣路的過程中,總是記下該點連線的下一個點的球的編號,形成類似連結串列的結構。③輸出再取出第一個加入柱子的球,來遍歷它所在的那條鏈。(和前面的那題最短路徑覆蓋差不多)
二分圖匹配(匈牙利)
基本都是板子(笑哭.jpg)
- [X] ☆飛行員配對方案問題(網路流24題)
(match陣列記錄的就是匹配到的人,列舉輸出就ok(我的板子用的match陣列)) [X] ☆假期的宿舍
- 是不是二分圖匹配的題目都這麼裸(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那邊連邊類推)
- 考慮矩陣中的點只能往兩個方向動,且有收益(費用),肯定要連邊,所以輸入的時候就把這些邊全部連起來,需要注意:①輸入的方法有些毒瘤;②一個點可以經過多次,但費用只可以被使用一次,那麼先連一條容量為1,費用為收益的邊,再連一條容量Inf,費用為0的邊,
- 看到資料範圍這麼小,但又不能暴力搞,看這一個標本只能被採一次,
- 很高興地告訴你,剩下的只有板子了(
這不廢話),但別忘了SPFA跑最長路,因為是求最大收益(費用),或者可以把費用手動改成負然後跑最短路,最後再負回來就行了。- 可以看看程式碼......
總結
這裡為剛入網路流
這個坑的同學們總結一下
- 網路流中最大流是考的最多的,但往往也是比較容易想到的(
放狗屁),雖然有些題目它的正解建邊十分複雜難想,但是是相對而言的- 其次考的多的就是費用流了,複雜多樣,各種花裡胡哨的考法,反正抓住一點:圖建出來了其他都不是事(
又在天真了),對,沒錯,網路流的所有難點就只有建邊了(對大多數人而言//鄙夷)- 至於二分圖,它本身就是最大流的一個特殊版本,其實我們根本不必把它放進來......基本都比較水吧。。。
那麼如果上面的題目實在是太水了,可以前往我的網路流題目詳講提高版看看