東拼拼,西湊湊,不就又水出一篇部落格嗎?
例 1.
\(\text\)
首先可以想到在 \([1,n]\) 列舉匯點,檢驗最大流是否為企鵝總數。
每個點初始的企鵝數可以由 \(s\rightarrow i\) 的邊表示,那跳出的企鵝呢?因為跳到哪個冰塊是未知的,所以不妨將 \(i\) 拆成兩個點 —— 在入點與出點之間連邊權為跳出企鵝數的邊。
例 2.
\(\text\)
這個建圖真的好妙啊!假設每一行、列的數字和分別為 \(r_i,c_i\),將行、列抽象成點,構造邊 \(\langle s,i,r_i-m \rangle\)、\(\langle i,t,c_i-n \rangle\)。最後將任意行與列之間連線容量為 \(19\) 的邊。
之所以將權值減一是因為網路流跑出的容量包含零,將區間變成 \([0,19]\),再加一就可以復原。最後如果最大流滿流就是有解的。
例 3.
圈地計畫
不在同一部分是不好判斷的,我們將網格圖黑白染色,將黑格的商業區看作白格的工業區,這樣就轉化成了同一部分的問題!
對於兩個相鄰的點,連權值為 \(c_+c_\) 的雙向邊,\(\text\) 只增加 \(c_+c_\)。這是因為這條雙向邊不可能同時刪除所有方向。**:\(\rm link.\)
另外還有一種複雜度較高的做法:黑白染色之後,對每兩個相鄰的點建兩個虛點 \(g_1,g_2\),表示同時在左部/右部,分別連 \(\langle s,g_1 \rangle\)、\(\langle g_2,t\rangle\),再以 \(\text\) 的權值連線虛點和相鄰點。因為列舉了在哪一部,所以複雜度提高。
例 4.
「雅禮集訓 2017 day8」價
先說一下建圖:
跑一遍最小割,答案就是最小割減去源點連出邊的權值。
要想理解這個模型,首先得明確幾個性質:
最後考慮一下為什麼定義 "割掉源點與藥的連邊相當於不選此藥" 這樣鬼畜的狀態。如果我們將源點與藥的連邊權值改成 \(\text+w_i\),即 "割掉源點與藥的連邊相當於選擇此藥",此時藥材邊可以不割,但實際上我們需要必須不割!
總結:網路流建圖時可以設計狀態描述 "必須" 與 "可以"。
例 5.
\(\text\)
由於有向圖存在尤拉迴路當且僅當圖連通且所有點的入度等於出度。考慮先將無向邊定向,然後分配度數。
令 \(d'_i=\) 出度 \(-\) 入度,那麼若 \(d'_i\) 為奇數則無解,否則令 \(d_i=d'_i/2\)。對於無向邊 \(\langle u,v \rangle\),若給它定向 \(u\rightarrow v\),就在網路中連一條 \(u\rightarrow v\),容量為 \(1\) 的邊,表示 \(u\) 可以貢獻乙個 "度" 給 \(v\)。
對於 \(d_i>0\) 的點,從源點連容量為 \(d_i\) 的邊;反之,向匯點連 \(-d_i\) 的邊。這樣最後檢驗從源點流出的邊是否滿流即可(檢驗匯點也可)。
跑一遍網路流後,當一條邊的殘餘容量為零時,就說明反向。輸出的時候記得將邊反向遍歷,就像這樣:
void print(int u)
}
例 6.
\(\text\) 遊戲
首先乙個比較經典的轉化是按座標之和的奇偶性將格點分成兩部,這樣 \(\text\) 和 \(\text\) 就只能分別走某一部。
可以證明,當 \(\text\) 從乙個不一定屬於最大匹配的點出發,\(\text\) 有必勝策略 —— 先假設這個點不屬於某個最大匹配 \(g\),此時 \(\text\) 一定只能走到乙個屬於 \(g\) 的點,現在 \(\text\) 可以選擇走到與當前點匹配的點,下一步,\(\text\) 可以走哪些點呢?
看似可以走不屬於 \(g\) 的點,但事實上,如果存在這種點,我們就成功找到了一條增廣路!這並不符合 \(g\) 是最大匹配的條件。於是 \(\text\) 只能走屬於 \(g\) 的點,\(\text\) 沿用之前的策略,就可以達到必勝的效果。
於是問題轉化為,如何求得不一定屬於最大匹配的點。最 \(\text\) 的思路是刪去乙個點再求最大匹配,不過難道就沒有更高效的做法嗎?
事實上,先用 \(\text\) 求出乙個最大匹配,從乙個非匹配點出發,如果到達與自己同部的點,那麼這些點都是非匹配點。這實際上是 "非匹配 - 匹配 - 非匹配 ..." 的過程,將匹配反向就可以使同部的點狀態取反。
具體實現:
注意特判走到源/匯的情況。
例 7.
\(\text\)數字配對
考慮網路流。思考如何判斷數字配對的條件 —— 樸素顯然是 \(\mathcal o(n^2\sqrt v)\) 的,難以接受。
試圖將質因數分解從二層迴圈拋到外面去:其實可以發現,配對條件滿足當且僅當存在整除關係且質因數個數和相差為 \(1\)。這個問題就解決了。
如何連邊?通過上文不難發現這是一張二分圖,按質因數個數的奇偶性分類。於是要求最大化配對就變成了最大流。由於需要保證獲得的價值總和不小於 \(0\),我們優先選擇費用更大的,也即 "最大費用最大流"。這個可以用 \(\text\) 來解決。
暑期總結 網路流
一張圖中每條邊都有同一時間能承載的最大資料量,求最大網路流即求從起點到終點同一時間能運輸的最大資料量。找到一條從起點到終點的路,那麼這條路上運輸的資料量為權值最小的邊的權值,然後再依次做下去,但這樣過早地阻塞了後面的流,會造成無法得到最優解。解決的方法是新增一條反向邊,如果邊 流過了k 那麼反向邊 ...
網路流小結
咱也不敢寫總結只能說小結因為到現在會的還是太少 也不說自己弱了因為即使是真的說了又有什麼用呢 還是老老實實自閉吧 士兵占領 最大流的板子,但是一開始想偏了。正解是用最大流求出並集,然後用全集減掉。緊急疏散 需要考慮的問題是每個門在一秒只能出乙個人,用到乙個拆點的思想。按照時間拆點,然後在各個空地建出...
網路流小結
注 因為風骨傲天習慣用 dfs dinic 所以不會用到 ek 等其他形式,而預流推進等較高階的,等我學了再說吧 事實上,這一部分只會包括最大流和最小費用最大流的略解,後面會補上帶上下界的。最大流 inline bool bfs return d t 1 0 inline int dfs int p...