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

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

前言:近期在複習這些東西,就xjb寫一點吧。固然之前也寫過,但此次偏重不太同樣html

MST

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

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

topo sort

應用:htm

  1. 能夠去掉基環樹上的樹
  2. DAG上拓撲序小的點指向拓撲序大的點。混合圖變DAG時拓撲排序一下而後把無向邊從左往右連就能夠了。(無解:原來有向邊構成的圖不是DAG)

Tarjan

強連通份量 SCC

low[u]定義爲u子樹中的點經過back edge和cross edge能達到的時間戳最小的點v的時間戳,且知足v能到達u(即v不在其餘已經肯定的SCC中)blog

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不能夠是父親排序

而後要特判根的時候,至少倆孩子才能夠get

PS:刪點變樹,不能刪割點class

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的新點,標號更小的點能夠是後加入的(但這時這個點可能已經由於以前的煞筆操做而被染成黑色了)

相關文章
相關標籤/搜索