關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記
關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記
前言:近期在復習這些東西,就xjb寫一點吧。當然以前也寫過,但這次偏重不太一樣
MST
最小瓶頸路:u到v最大權值最小的路徑。在最小生成樹上。是次小生成樹的一個子問題qwq
最小極差生成樹:枚舉最小生成樹上的最小權值的大小
topo sort
應用:
- 可以去掉基環樹上的樹
- DAG上拓撲序小的點指向拓撲序大的點。混合圖變DAG時拓撲排序一下然後把無向邊從左往右連就可以了。(無解:原來有向邊構成的圖不是DAG)
Tarjan
強連通分量 SCC
low[u]定義為u子樹中的點通過back edge和cross edge能達到的時間戳最小的點v的時間戳,且滿足v能到達u(即v不在其他已經確定的SCC中)
if(!dfn[v]) {
dfs(v);
low[u] = min(low[u], low[v]);
} else if(!belong[v]) low[u] = min(low[u], dfn[v]);
割點
low[u]定義不變,由於是無向圖所以u和父親的連邊就是tree edge,即v不可以是父親
然後要特判根的時候,至少倆孩子才可以
PS:刪點變樹,不能刪割點
2-SAT
以前的
形式:
每個變量有兩個取值(x,x‘),有一些條件限制了某兩個變量不能同時取某個值。即“或”。
構圖:
對於限制(a,b),連有向邊(a,b‘),(b,a‘)
a -> b 意味著a成立時b必須成立
染色做法:
選擇一個沒有賦值的變量x,賦值為真,然後dfs染色下去,沖突則無解(x和x‘都為真)
應用:
判斷某個變量在該系統中是否可取真:
從此變量開始dfs即可
求字典序最小的解:
從小到大,先賦值真染色,沖突的話把這次染色回滾掉,再賦值假染色
就是說進行x時,1...x-1時dfs染色的結果還保留著
復雜度:最壞\(O(nm)\)
優勢在於我們擁有決定一個變量取值的能力
SCC做法
原圖有對稱性
顯然一個scc中的點要麽都選要麽都不選,x和x‘在同一個scc中則無解
縮點,反向連邊
進行拓撲排序,選第一個未染色的點,染白色,然後將否定點及其新圖後代dfs染黑色(註意邊是反向的,所以一個點為假那麽他的後代一定為假)。重復此過程。
復雜度:\(O(m)\)
局限性很強,只能判斷是否有解和構造一組解
字典序最小的解也不可做,因為toposort中不斷加入ind=0的新點,標號更小的點可以是後加入的(但這時這個點可能已經因為之前的煞筆操作而被染成黑色了)
關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記