Tarjan專題總結複習

2022-05-04 13:30:10 字數 1040 閱讀 5857

\(dfn[x]\):\(x\)第一次被訪問的時間順序(時間戳)

搜尋樹:每個節點只訪問一次,所有訪問過的邊\((x,y)\)構成一棵搜尋樹

\(low[x]\):定義為以下節點的時間戳的最小值:

\(1.\)

\(subtree(x)\)中的節點。

\(2.\)通過\(1\)條不在搜尋樹上的邊,能夠到達\(subtree(x)\)的節點。

void tarjan(int x)

else if (vis[y]) low[x] = min(low[x], dfn[y]);

//已經訪問過,且y不是x的兒子,因為dfn[y]一定小於dfn[x],那麼用dfn[y]更新(不用low[y]更新,因為它們不一定在同乙個強連通分量中,防止更新過頭)

}if (dfn[x] == low[x])//形成了乙個環,說明x是乙個強連通分量的根

while (now != x);//彈出

}return;

}

在跑了一遍tarjan後,對於原來的每條邊對應的點對\((x,y)\),若\(col[x]==col[y]\),說明它們在同乙個強連通分量內,則它們不用在新的圖中連邊,否則要連。

偽**:

for (int x = 1; x <= n; ++ x)

}

割點定義:若去掉無向聯通圖的某個點後,此圖不連通,則該點為割點。割邊同理。

判斷方法:

割邊:\(dfn[x](說明從\(subtree(y)\)出發,在不經過(x,y)的前提下,無論走那條邊,都無法到達\(x\)或比\(x\)更早的節點,這就是一條割邊)

割點:\(dfn[x]\le\)(和割邊同理。特別地,若\(x\)是搜尋樹根節點,那麼\(x\)是割點當且僅當它存在至少兩個子節點\(y_1,y_2\)滿足條件)

偽**(割點)

if (low[y] >= dfn[x])

tarjan複習筆記

tarjan求強連通分量 割點總體思想 遍歷每乙個結點並使用並查集記錄父子關係。tarjan 是一種dfs的思想。我們需要從根結點去遍歷這棵樹。當遍歷到某乙個結點 稱之為 x xx 時,你有以下幾點需要做的。將當前結點標記為已經訪問。遞迴遍歷所有它的子節點 稱之為 y yy 並在遞迴執行完後用並查集...

tarjan複習小結

雖然是複習,但還是學到許多。過程中遇到四種邊 1 樹枝邊 dfs 搜尋樹上的邊 滿足邊 u,v v 不在棧中 u 為 v 的父節點 2 前向邊 與 dfs 方向一致 祖先指向子孫 沒什麼用 3 後向邊 與 dfs 方向相反 子孫指向祖先 滿足邊 u,v v 在棧中,u 為 v 的祖先節點 4 橫叉邊...

Tarjan 複習小結

一 割點。void tarjan r i,r rt else low i min low i dfn to k if i rt sum 1 ans i 1 注意 在不聯通圖中,應當 for r i 1 i n i if dfn i tarjan i,i 這樣才能保證全部求到,注意根節點.二 橋。vo...