Tarjan演算法詳解

2021-07-28 18:32:38 字數 1616 閱讀 3426

tarjan演算法的用途

1.求橋和割點

2.求點和邊的雙連通分量

3.求強連通

targan演算法的流程

利用dfs來遍歷圖來構建一種數型的結構

tarjan演算法的兩個核心陣列<1>對於第一種用途

tarjan演算法原理

我們從1開始遍歷,發現6,5,4的low不小於dfn[3],故3為割點(即4,5,6都無法到達3以上的點)

我們發現對於邊(2,5)low[5]大於dfn[2]即5的子樹中的任何點無論如何都無法通過其他方式到2以上的點

於是我們得到了乙個橋。

例題:給出一張連通的無向圖g,求出至少加入多少條邊才能使得圖g是乙個邊雙連通的。

即求邊雙連通分量把度為一的節點數x (x+1)/2即為答案

注意:求邊雙連通分量時low相同的即為同一組

const

int m=10005;

bool

map[m][m],vis[m];

int low[m],dfn[m],cnt[m],num,n,m;

void init()

void dfs(int x,int f)else min(low[x],dfn[i]);

}}int main()dfs(1,0);

int ans=0;

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

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

if(map[i][j])

if(low[i]!=low[j])//注意:求邊雙連通分量時low相同的即為同一組

cnt[low[j]]++;

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

if(cnt[i]==1)ans++;

printf("%d",(ans+1)/2);

return

0;}

例題:

給出乙個無向圖,你可以在一些點設定一些出口,使得刪去任意乙個點之後,其他所有的點都至少與乙個出口連通,求在出口數量最小情況下的放置出口的方案。

即求點雙連通分量中割點的數量

我們可以用dfs雙連通分量求。因為每個割點一定是雙連通分量中重複部分

void tarjan(int

x,int f)}}

}void dfs(intx)}

int main()

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

}for(int i=1;i<=n;i++)

}printf("%d

%d",ans1,ans2);

}

tip:ta

rjan

縮點

void tarjan(int x,int f=0)}}

}

tarjan演算法詳解

參考 tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大 具體思路 令dfn u 表示當前點的時間戳 low u 表示當前點所能到達的點的時間戳中最小的乙個 到達點u時,將其入棧 拓展點u後代 當且僅當dfn u low u 時,棧頂元素全部出棧,此時出...

Tarjan演算法詳解

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 所以我們在回溯的過程中就能夠通過判...

Tarjan演算法詳解

tarjan是用來解決圖的割邊割點問題以及有向圖的強連通分量 縮點 的問題的。割邊是圖論演算法中一類很常見的問題 在乙個連通圖g中,假設有一條邊e,去掉e後圖g不再連通,那麼e就是g的一條割邊。換句話說,g是連通圖,g e不是連通圖。最暴力最暴力的演算法就是每次都去掉一條邊,然後進行dfs深度優先遍...