NOIP 也許考不到,但是可以拿來騙分也說不定(
演算法原理就算了,反正也不需要知道,只需要知道它在幹什麼並且會建圖就行了。
二分圖就是左右兩部點,同一部內的點無連邊,可以考慮建二分圖後網路流。
持續放些題。
一些基本理論和建模方式
-
最小割=最大流
-
最大權閉合子圖
-
切糕模型
-
二分圖最小點覆蓋=最大匹配數
-
二分圖最大獨立集=二分圖的總頂點數-最大匹配數
-
最小路徑覆蓋數=DAG中的點數-二分圖最大匹配數(在DAG中選取最少的路徑,使每個點僅屬於一條路徑且路徑不可重複)(將每個點拆開,邊表示為一個點的出度到另一個點的入度,點拆開的兩個部分分屬兩部)
題
P3410 拍照
你需要知道什麼是最大權閉合子圖,即給定一張有向圖,每個點都有一個權值(可以為正或負或 \(0\)),你需要選擇一個權值和最大的子圖,使得子圖中每個點的後繼都在子圖中。
做法:考慮網路流,若 \(u\) 節點權值非負,\(s\) 向 \(u\) 連一條流量為 \(val[u]\) 的邊,權值為負則 \(u\) 向 \(t\) 連一條流量為 \(|val[u]|\) 的邊。原圖上的邊流量為 \(\inf\),所有正權值減去最小割即是答案,這是板子題,證明懶得證。
[AGC034D] Manhattan Max Matching
不管曼哈頓距離,容易看出這是二分圖,暴力 \(O(n^2)\) 連邊後也顯然是跑二分圖最大權匹配。考慮費用流來做,要建源點 \(s\) 向所有左部點連容量 \(1\) 邊權 \(0\) 的邊,所有右部點也這麼向匯點 \(t\) 連邊。
考慮最佳化建圖。關於曼哈頓距離的最大值有個trick了:考慮拆絕對值,這樣曼哈頓距離的四個座標取值都有正負號的取值,共16種曼哈頓距離的式子。我們要暴力全部連邊的原因是不能簡化曼哈頓距離的形式讓所有點可以連在固定的幾個點上計算。現在可以了,考慮建四個點,讓 左部點向這四個點/這四個點向右部點 連一條容量 \(inf\) 權值為 \(\pm x_i\pm y_i\) 的邊,然後直接跑最大費用最大流就行,這個題保證了兩部點的數量相同且要匹配完。需要注意的是本題中曼哈頓距離拆式子的trick不能用在最小值上。