1. 程式人生 > >關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記

關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記

時間戳 def 條件 問題 復習 lin 由於 保留 染色

關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記

前言:近期在復習這些東西,就xjb寫一點吧。當然以前也寫過,但這次偏重不太一樣

MST

最小瓶頸路:u到v最大權值最小的路徑。在最小生成樹上。是次小生成樹的一個子問題qwq

最小極差生成樹:枚舉最小生成樹上的最小權值的大小

topo sort

應用:

  1. 可以去掉基環樹上的樹
  2. 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‘都為真)

應用:

  1. 判斷某個變量在該系統中是否可取真:

    從此變量開始dfs即可

  2. 求字典序最小的解:

從小到大,先賦值真染色,沖突的話把這次染色回滾掉,再賦值假染色

就是說進行x時,1...x-1時dfs染色的結果還保留著

復雜度:最壞\(O(nm)\)

優勢在於我們擁有決定一個變量取值的能力

SCC做法

原圖有對稱性

顯然一個scc中的點要麽都選要麽都不選,x和x‘在同一個scc中則無解

縮點,反向連邊

進行拓撲排序,選第一個未染色的點,染白色,然後將否定點及其新圖後代dfs染黑色(註意邊是反向的,所以一個點為假那麽他的後代一定為假)。重復此過程。

復雜度:\(O(m)\)

局限性很強,只能判斷是否有解和構造一組解

字典序最小的解也不可做,因為toposort中不斷加入ind=0的新點,標號更小的點可以是後加入的(但這時這個點可能已經因為之前的煞筆操作而被染成黑色了)

關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記