Tarjan演算法流程和簡要證明

2021-07-31 17:17:38 字數 2247 閱讀 1036

一下許多內容摘自:

北京大學暑期課《acm/icpc競賽訓練》強連通分支、橋和割點 北京大學資訊學院 郭煒

不建議初學者直接看這篇博文

可以先了解一下tarjan演算法的具體流程,再來看證明。

推薦:全網最!詳!細!tarjan演算法講解

如果有向圖g的每兩個頂點都強連通,稱g為強連通圖。

非強連通圖有向圖的極大強連通子圖,稱為強連通分量。

dfn[i]表示 遍歷到 i 點時是啥時候(dfs過程中的訪問序號)。

所以dfn[i]越小,就說其越「早」。

low[i]表示從i節點出發dfs過程中i下方節點v

1 (開始時間大於dfn[i],且由i可達的點)所能到達的最早節點的開始時間。dfs過程中,碰到哪個節點,就將哪個節點入棧。棧中節點只有在其所屬的強連通分量已經全部求出時,才會出棧。

對於u的子節點v,從v出發進行的dfs結束回到u 時,使得 low[u] = min(low[u],low[v])。因為u可達v, 所以v可達的最早的節點,也是u可達的。

如果發現某節點u有邊連到棧裡的節點v

2,則更新u的low值為min(low[u],dfn[v]) ,若low[u]被更新為dfn[v],則表明目前發現u可達的最早的節點是v. (注意v在棧中,v比u先被訪問到)

如果乙個節點u,從其出發進行的dfs已經全部完成並回到u,而且此時其low值等於dfn值,則說明u可達的所有節點,都不能到達任何比u早的節點— 那麼該節點u就是乙個強連通分量在dfs搜尋樹中的根。那麼現在將棧中u及u上方的節點全部彈出,彈出的節點構成乙個強連通分量。

偽**:

void tarjan(u)

else

if (v in stack)

} if (dfn[u] == low[u])//退棧,把整個強連通分量都彈出來 }

} //複雜度是o(e+v)的

為什麼從u出發的dfs全部結束回到u時,若 dfn[u]=low[u], 此時將棧中u及其上方的節點 彈出,就找到了乙個強連通分量?

強連通分量的特性:有向邊,任意兩個節點都可以相互到達。

此時所有節點分成以下幾類:

1)還沒被訪問過的節點

2) 棧中比u早的節點(在u下方)

3) 棧中比u晚的節點(在u上方)

4) 棧中的u

5) 曾經入棧(訪問過),又出了棧的節點

證明:

1):顯然由u不可達。

2):由u不可達,因為dfn[u] = low[u]; u怎麼轉,能到達最早的點只有自己。

3):u可達此類節點,且這類節點可達u。

u可達此類節點是顯然的。

證:此類節點可達u

若有此類節點x不可達u,首先不存在有向邊(x->u),尋找x所能到達的最早的:

1.如果就是x,low[x]=dfn[x],則x應該已經被彈出棧了,這和x是第3類節點矛盾。

2.棧裡面的節點y,則y必然比u晚,因為dfn[u]=low[u],u最早能到達的點為其本身,y比u早,則是y。而且有 low[y] = dfn[y](若此條不成立,則x還能到達比y更早的節點,矛盾)。而若 low[y] = dfn[y],則y應該已經被彈出棧了,y上方的x當然也已經不再棧中,這和x是第3類節點矛盾。

4):略。

5):這類節點不可達u

1.早於u遍歷到,早於u的出棧即證明不可達u。

若可達的話,它此時應該還在棧裡面,u的下面 —導致矛盾。

2.晚於u遍歷到,任取節點x,假設x可達的最早節點是y,則y一定晚於u, 即 x不可達u. 任取節點x。x之所以已經被彈出棧,一定是 因為最終low[x] = dfn[x],或x位於某個y節點上方, 由y可達,且y滿足條件:最終的 low[y] = dfn[y]。 因為y曾經出現在u的上方,所以y一定晚於u。因為 low[x]不可能小於等於dfn[u](否則low[y]就也會小於等於dfn[u],這和low[y]=dfn[y]矛盾),所以x到達不了u及比u早的節點。

that』s all, thanks!

Tarjan演算法 kosaraju小證明喲

看的別人寫的 很好,摘要幾點的啦 一.概念 1.強連通 如果在乙個有向圖上兩個結點u,v他們相互之間至少存在一條通路,則他們是強連通的.2.強連通圖 如果有向圖g任意兩天都強連通,則g是強連通圖.3.強連通分量 有向非強連通圖的極大強連通子圖.二.o n m 的trajan,特麼的trajan是個甜...

割點和橋 Tarjan演算法

使用tarjan演算法求解圖的割點和橋。1 割點 主要的演算法結構就是dfs,乙個點是割點,當且僅當以下兩種情況 1 該節點是根節點,且有兩棵以上的子樹 2 該節點的任一子節點,沒有到該節點祖先的反向邊 就是說如果沒有這個割點,那麼這個子節點和那個祖先之間不連通 void cutpoint tarj...

Tarjan演算法求橋和割點

預備定義 low u 定義為u或者u的子樹中能夠通過 非父子邊 追溯到的最早的節點的dfs開始時間 d u 表示dfs過程中u的進棧時間 割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。橋 無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。判斷割點方法 1 u為樹根,且u有...