Spark Special 圖論_楊寧遠 雜題分析
Date: 2024-07-03
Preface
本文基於楊寧遠 @ynycoding 的課件與題單,對省選/NOIP階段圖論的建模方法和解題策略進行總結,以及本階段常用方法、模型和 Trick。
A. [AGC056C] 0/1 Balanced
[AGC056C] 01 Balanced - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
要求構造字典序最小的長為 \(n\) 的 0/1 字串 \(s\) 滿足 \(m\) 個條件形如 \((l,r)\) ,單個條件表示 \(s[l\dots r]\) 中必須有相同個 0/1。
其中 \(2\le n\le 10^6,1\le m\le 2\times 10^5\) 。
Solution
差分約束
題目中的限制很容易地就能用字首和表示,我們容易建立這樣的差分約束系統:
Def \(S_i\) 代表前 \(i\) 箇中 \(1\) 的個數
-
\(\forall (l,r),S_r-S_l=\frac{r-l+1}{2}\)
-
\(\forall i\in[1,n),0\le S_i-S_{i-1}\le 1\)
嗯,但是這樣會建立負權邊,只能用 SPFA 求解,時間複雜度最壞 \(\mathcal O(n)\)
我們想,如果能夠直接一點,每條限制 \(l,r\) 的表示不會與 \(l,r\) 相關,這樣邊權就大大簡化了
於是我們可以考慮定義 \(S_i\) 為前 \(i\) 箇中 \(1\) 的個數減去 \(0\) 的個數,這樣,第一類條件可以直接用等於表示,第二類條件則變為:\(\forall i\in[1,n),S_i-S_{i-1}\in \{-1,1\}\) 。
差分約束實際上求出的是最大的解,即對於所有 \(a+x\ge b\) 這樣的條件,求出的都是剛剛好滿足這些條件的解,即對於最嚴格的限制,滿足 \(a+x=b\)
考慮說明不會存在 \(S_i=S_{i-1}\) ,歸納假設 \(\forall j\in[1,i)\) 都滿足 \(S_j\neq S_{j-1}\)
若 \(i\) 沒有作為第一種事件的 \(r\) ,那麼顯然不可能存在這種情況。否則,則說明:\(S_l=S_i=S_{i-1} \) ,與歸納假設矛盾。
可以這樣理解,這種情況相當於填充空字元,但是如果只填一個肯定是沒用的,他也不能幫你構造合法方案,如果填了偶數個空格,不如把靠前的換成 \(0\) 靠後變成 \(1\)
同時,求解出了最大的解,只需要 flip 一下就是最小的解。
Conclusion
本題提示我們:
-
可以利用字首和建立有關數量的限制
-
儘量簡化邊權,消除與第三變數相關的因素,直接用等量關係以及固定邊權
-
差分約束是求出最大的解
B. [NOI2001] 食物鏈
P2024 [NOI2001] 食物鏈 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
現有三種元素 \(A,B,C\) 定義他們之間有關係 \(A\to B,B\to C,C\to A\)
現有 \(n\) 個元素 \(|S|=n,\forall x\in S,x\in \{A,B,C\}\) ,按順序給出 \(q\) 個語句,每個都是以下的其中一種:
-
給出 \(X,Y\in S\),指明他們滿足 \(X\to Y\)
-
給出 \(X,Y\in S\),指明他們滿足 \(X=Y\)
現求這些語句有幾句不合法語句,即應用之後使得不存在一種賦值方案滿足前面所有的合法語句
Solution
典中典,並查集
使用擴充套件域可以很簡單地解決問題,現在看看邊帶權。
採用帶權並查集維護與當前父親的關係,這是一個迴圈的關係,使用 \(\mathbb F_3\) 關於 \(+\) 形成的群可以維護這個資訊。
在合併和路徑壓縮的時候維護即可。
Conclusion
-
擴充套件域描述了物體的多個屬性
-
邊帶權可以用來維護與父親節點的關係
C. CF118E Bertown roads
Problem - E - Codeforces
Problem Statement
給定無向連通圖 \(G\) ,現要將 \(G\) 中每條邊定向,要求定向後是強連通的,詢問是否可能並輸出方案。
Solution
注意到原圖只要是邊雙連通的即可,原因是,如果建立 dfs 樹,在任何一個點只沿著返祖邊往上爬一定能夠回到根節點,否則在無法這樣做的地方必然形成橋,這也給出了構造方案。
Conclusion
-
基於 dfs 樹深度優先的性質,事實上,無向圖的 dfs 樹上的非樹邊沒有橫叉邊。
-
基於上述性質,利用 dfs 樹的深度以及 dfn 序來解決一些與連通性有關的問題非常有用,例如 圖上二選一構造問題
-
Tarjan 利用追溯值來處理能夠到達的祖先,來確定子樹是否封閉(存在環),我們可以透過維護一個棧,在 \(low[x]=dfn[x]\) 時及時彈出來求出 \(\mathbf{eDCC}\)
D. 最大 XOR 和路徑
P4151 [WC2011] 最大XOR和路徑 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
給定帶權無向連通圖 \(G\),請求出一條路徑 \(P(1\to n)\) 使得對於路徑上的點 \(p_1,p_2,p_3,\dots,p_n\) ,其中 \(p_1=1,p_n=n\) ,最大化 \(\bigoplus\limits_{i\in[1,n)}w(p_i\to p_{i+1})\)
Solution
思維,線性基,DFS樹
這是一個好題,需要挖掘一些性質。
不難注意到以下事實:
-
必選一條 \(1\to n\) 的簡單路徑和若干簡單環(從 \(1\) 出發可達的)
-
這一條簡單路徑可以隨便選
那麼只需要在 dfs 樹上維護字首異或值,遇返祖邊直接線上性基里加入該環。
Conclusion
-
可先從簡單的情況開始尋找性質,例如右圖
-
然後加入環套環這樣的情況進一步尋找性質
-
dfs 樹可以用來找到簡單環
E. Edges in MST
Problem - 160D - Codeforces
Problem Statement
給定一個帶正權無向連通圖 \(G\) ,求每條邊是否是:最小生成樹的必須邊/可行邊
Solution
思維,Tarjan,並查集
考慮替換 MST 形成新的 MST,發現只有邊權相等的邊才能互相替換,但是這樣想是不方便進行維護的(您需要路徑修改相等邊集合)。
考慮構造性的思路,在 Kruskal 演算法構造 MST 的時候,對於所有邊權相等的邊 \(u_1,u_2,\dots,u_m\) ,如果 \(u_i\) 兩邊已經連通,則是不可能邊,否則,加入圖中跑 Tarjan,如果是橋邊,說明這是一條必須邊,否則是可行邊。
Conclusion
-
對於最小生成樹問題,可以考慮三種思路:
-
替換邊思路
-
邊貪心構造思路(Kruskal、Boruvka)
-
MST 擴充套件思路(Prim)
-
F. Tourists
Problem - 487E - Codeforces
Problem Statement
給定無向連通圖 \(G\),點帶權,要求支援如下兩種操作:1. 單點修改點權 2. 求 \(a\to b\) 所有簡單路徑上最小點權的最小值
Solution
圓方樹,樹鏈剖分,Tarjan
我們維護的是無向圖上的簡單路徑資訊,而且還是路徑最小值,我們想想簡單路徑的構成,可以發現,如果一條路徑走入一個點雙,那麼我們就可以訪問點雙的任何一個點,然後從任何地方出來,這樣,點雙內部怎麼走我們就不需要知道,所以我們乾脆把點雙壓成一個點,然後修改的時候改歸屬即可。
如果你這麼想了,那麼恭喜!如果當年是你在 WC,那麼發明 圓方樹 的人就是你了。
那麼建立圓方樹,用 multiset
維護與方點相連的點的權值,樹鏈剖分建線段樹求最小值即可
Conclusion
-
圓方樹主要是注意到維護的路徑資訊可以在點雙裡壓縮
-
維護無向圖的路徑,優先考慮圓方樹,其次可以考慮在生成樹上處理(如 dfs 樹)
G. Too Many Constraints
Problem - 1697F - Codeforces
Problem Statement
要求你求出序列 \(a_1,a_2,\dots,a_n\),要求滿足若干限制:
-
\(\forall i\in[1,n),a_i\le a_{i+1}\)
-
\(\forall i\in[1,n],a_i\in [1,k]\cap \mathbb Z\)
-
若干句要求,每條形如,\(a_i\neq x\)
-
若干句要求,每條形如,\(a_i+a_j\le x\)
-
若干句要求,每條形如,\(a_i+a_j\ge x\)
輸出方案,或者報告無解。
Solution
2-SAT
這種約束容易讓人想到差分約束,但是回顧一下三角形不等式的形狀,我們發現變數前面帶係數,這是不可以的。
我們發現 \(k\) 沒有多大,顯然每一個取值是否可以是很容易確認的,每一條要求都是在值域上面的一個限制,都是可以轉化為要求值域小於/大於一個值,我們發現這是不錯的。在應用了所有條件以後,我們要確定變數的值域,所以我們可以把 \(k\) 個取值都建立出來,每個條件就會排除其中一些,我們發現限制的後兩者說的就是 如果 \(a_i\) 取到 \(p\) 那麼 \(a_j\) 就必須取 \(\le x-p\) 的那些。
我們發現,如果ai取值p則bi取值q
很類似 2-SAT,可以將每個變數建立成一個變數,表示選或者不選。欸,問題來了,怎麼保證一個變數選且僅選一個值呢?
所以這樣是不行的,這幾個變數之間太獨立了,2-SAT 只能保證最多一個點選,無法保證一定有一個點被選,這時候,我們可以把變數的要求改為 \(x_i\) 是否 \(\le k\) ,這樣的好處是,我們可以透過欽定 “如果 \(x_i\) 不是 \(\le k\) 的,那麼就必須 \(\le k\)” 來欽定它必選。其他的很簡單,請自己補全。
Conclusion
- 本題為我們提供了變數值域限制問題的新解法,透過拆值域建立 \(\le\) 來進行 2-SAT
H. 序列
#3629. 「2021 集訓隊互測」序列 - 題目 - LibreOJ (loj.ac)
Problem Statement
要求構造序列 \(a_1,a_2,\dots,a_n\) ,滿足以下限制:
-
\(\forall i\in [1,n],a_i\in [1,10^9]\)
-
\(m\) 個這樣的限制: \(a_i+a_j+a_k-\max(a_i,a_j,a_k)-\min(a_i,a_j,a_k)=x_i\)
輸出方案,或者報告無解。
Solution
2-SAT
注意到第二個資訊是指 \(a_i,a_j,a_k\) 的中位數必須是 \(x\)
那麼我們發現,要使得中位數為 \(x\) ,則至多隻能存在一個數大於 \(x\),至多隻能存在一個值小於 \(x\),這樣剩下的那個數顯然就即不能大於 \(x\) 又不能小於 \(x\),就只能為 \(x\),這樣就可以了。
這就很想上一個題目,但是,這值域太大了吧?但是一想,用到的資訊其實沒有那麼多,大部分值域都沒有用。我們考慮簡化值域的方法即離散化,這個題能不能離散化呢?
可以!考慮若對於資訊 \((a_i,a_j,a_k,x)\) ,對於其中確定為中位數的那個,只能選擇 \(x\),對於其中不為中位數的其餘兩個數,例如若 \(a_i\le x\) ,且在最後方案裡面 \(a_i\notin \{x_k\vert k\in[1,m]\}\) ,我們考慮這種方案可以被替換成其他的限制的元素(您可以模擬一下不同情況)。
那麼我們直接離散化即可。
Conclusion
-
對於取值限制問題,應該儘量思考每個變數的取值對於其他變數有什麼影響
-
對於取值限制問題,儘量減小每個變數的值域
I. Flip and Reverse
Skipped, TBD
J. Red-Blue Graph
Skipped, TBD
K. 圓桌問題
P3254 圓桌問題 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
現有 \(m\) 種不同顏色的球每一種 \(r_i\) 個,有 \(n\) 個盒子每個容量不同分別是 \(c_i\),要求將所有球分配到盒子裡,要求每個盒子裡不能包含相同顏色的球,輸出任何一個方案或者報告無解。
Solution
網路流
網路流的題目沒有很明顯的特徵,但是本題資料範圍很小,可以考慮。
我們可稱本題的模型為 選擇貢獻-數量限制模型
建立要進行數量限制的單元,本題有三種數量限制:
-
球數限制
-
容量限制
-
貢獻數量限制
提取並建立
Conclusion
選擇貢獻-數量限制模型
應該準確提取對題目中元素的限制是什麼,把限制的提供者和貢獻的流向建出來
L. 蜥蜴
P2472 [SCOI2007] 蜥蜴 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
在一個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓儘量多的蜥蜴逃 到邊界外。
每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何一個石柱上。
石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不變),如果該石柱原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同一個石柱上。
Solution
網路流,最大流
本題和上面那個題的模型是一樣的,直接建圖即可,不再贅述。
M. 魔術球問題
P2765 魔術球問題 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
假設有 n 根柱子,現要按下述規則在這 n 根柱子中依次放入編號為 \(1,2,3,\dots\) 的球。
- 每次只能在某根柱子的最上面放球。
- 在同一根柱子中,任何 2 個相鄰球的編號之和為完全平方數。
試設計一個演算法,計算出在 n 根柱子上最多能放多少個球。
Solution
最大流
其實此題和前面的模型也是一樣的,但是有一點不同的
此處我們最大流的含義是,前面最多少開幾個柱子,即最多合併幾次,每一次加一個數 \(x\),加邊 \(S\to in_x,out_x\to T\) ,對於所有 \(y<x,x+y=a^2,a\in\mathbb N^*\) ,加邊 \(in_y\to out_x\) ,即可以把 \(y\) 整個接到 \(x\) 後面,節省了一個柱子。
網路流是一種會調整之前流量的演算法,故在殘量網路上跑最大流的過程包含了進行退流和重新推流的過程,前者表示拆分一個已經合併的柱子,取消之前的一次合併,後者表示進行一次合併。
Conclusion
-
最小消耗可以轉化為最大節省,常常是最大化合並
-
利用網路流的退流,要處理有順序的問題時,可以依次加入點,然後再殘量網路上跑最大流即可
N. 危橋
P3163 [CQOI2014] 危橋 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Solution
本題比較玄學,要求強大的注意力,筆者也沒有這樣的注意力,遇到這種題只能自認倒黴。
P3163 [CQOI2014] 危橋 題解 - 洛谷專欄 (luogu.com)
Conclusion
沒有
O. Bricks
Problem - 1404E - Codeforces
Problem Statement
你有一個 \(n\times m\)(\(1\le n,m\le 200\))的格子紙,格子要麼塗黑(#
)要麼塗白(.
)。你需要用若干個長為一,寬為任意正整數或者寬為一,長為任意正整數的長方形去覆蓋所有黑色格子,要求不能蓋到白色格子上,不能蓋到其他長方形上,不能蓋出格子紙的邊界,求最少用多少個長方形。
資料保證至少有一個黑色格子。
Solution
最大流,二分圖,最大匹配,最大獨立集,最小割
本題與 M 題類似,都是要最小化一個花費,我們發現可以把兩塊相連同向的木板連成一塊,這啟發我們用上面同樣的方式,我們在兩個單元格之間建立一個點,我們發現,如果一個格子上/下面的點和左/右邊的點同時被選,則是不合法的,所有我們把所有上下的點放在二分圖左部,左右的點放在右邊,中間不能同時選的連邊,此時答案就等於二分圖的最大獨立集。
Conclusion
我們有必要檢視幾個常用結論
-
最大流=二分圖最大匹配=最小割=最小點覆蓋
-
補圖的最大獨立集等於原圖最大團
-
n-二分圖最大匹配=n-二分圖最小點覆蓋=n-二分圖最小割=最大獨立集
-
DAG的最小路徑點覆蓋=n-拆點二分圖的最大匹配,最小路徑可重複點覆蓋可先傳遞閉包再做普通最小路徑點覆蓋
-
本題用到的結論可以透過構建一個圖跑最小割證明,即 n-二分圖最小割=最大獨立集
P. 文理分科
P4313 文理分科 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
小 P 所在的班級可以用一個 \(n\times m\) 的矩陣進行描述。現每人必須從文科和理科中選擇一科。選擇科目會獲得一個滿意值:
-
如果第 \(i\) 行第 \(j\) 列的同學選擇了文科,則他將獲得 \(art_{i,j}\) 的滿意值,如果選擇理科,將得到 \(science_{i,j}\) 的滿意值。
-
如果第 \(i\) 行第 \(j\) 列的同學選擇了文科,並且他相鄰(四連通)的同學全部選擇了文科,會增加 \(same\text{\underline{ }}art_{i,j}\) 的滿意值。
-
如果第 \(i\) 行第 \(j\) 列的同學選擇了理科,並且他相鄰的同學全部選擇了理科,則增加 \(same\text{\underline{ }}science_{i,j}\) 的滿意值。
求最大滿意值之和。
Solution
最小割
這是一種新的最小割模型 ,我們知道最小割這種東西就是用來計算代價的。那麼我們不妨假設全部貢獻都已經獲得,對於每一個人,顯然只能選擇一科,不妨表示為 0/1,則問題變為一個變數取值的問題。現在考慮怎麼限制條件二三。考慮新建一個節點,把它與所有牽涉到的人連一條 \(+\infty\) 的邊,然後連到原點,權為對應的 \(same\_xxx\) 貢獻。
Conclusion
-
最小割是用來計算代價的,假設全部貢獻已經獲得就可以化為最小割
-
不妨考慮如果不滿足要求,怎麼樣才可以阻礙這種情況形成,除非放棄貢獻,支付代價。
Q. 切糕
P3227 [HNOI2013] 切糕 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
有一個 \(n\times m\) 的矩陣 \(a_{i,j}\in [1,R]\) ,每個位置及這個位置的數合起來有一個權值 \(v(i,j,a_{i,j})\) 。現在給出這個所有的權值 \(v\) ,求滿足相鄰位置(上下左右)的值之差 \(\le D\) 這一限制的情況下,權值和最小是多少,即使得 \(\sum_{x,y}v(x,y,a_{x,y})\) 最小。
\(1\le n,m,R\le 40,0\le D\le R\)
Acknowledgement: @lupengheyyds
Solution
最小割
本題即切糕模型,用於解決離散變數取值問題,不同取值有一個貢獻,而不同變數之間又有限制,形式常為變數差/和大於/小於給定值。
此時我們建立一條鏈,表示所有可能取值,割掉即表示選擇這個取值(如何保證只取一個?代價非負),然後嘗試阻礙不合法的情況形成,只需要向對應的變數連邊。
R. 狼抓兔子
P4001 [ICPC-Beijing 2006] 狼抓兔子 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Problem Statement
即給定一個加上所有左上到右下斜邊的網格圖,求最小割。
Solution
最小割,平面圖
重要定理:平面圖最小割等於其對偶圖的最短路
S. Starry Night Camping
Starry Night Camping - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
Skipped, TBD
T. 太空飛行計劃問題
最小割
比較簡單,跳過
U. order
是上面那個的推廣,也比較簡單。
V. Dominance
把座標系轉 45° 然後就變成掃描線。
Postscript
啊啊啊啊啊寫完了
感受思維的脈搏