tarjan演算法詳解

2021-07-05 22:18:56 字數 1600 閱讀 2287

參考:

tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大

具體思路:令dfn【u】表示當前點的時間戳

low【u】表示當前點所能到達的點的時間戳中最小的乙個

到達點u時,將其入棧

拓展點u後代

當且僅當dfn【u】=low【u】時,棧頂元素全部出棧,此時出棧的元素即為乙個強連通分量。

我寫的程式:

type

point=^node;

node=record

v:longint;

next:point;

end;

varinstack:array[0..100000]of boolean;

time,top,n,ans,i,x,y:longint;

low,stack,dfn:array[0..100000]of longint;

a:array[0..100000]of point;

function min(a,b:longint):longint;

begin

if aexit(b);

end;

procedure tarjan(u:longint);

varp:point;

v:longint;

begin

time:=time+1;

low[u]:=time;dfn[u]:=time;

stack[top]:=u;

instack[u]:=true;

top:=top+1;

p:=a[u];

while p<>nil do

begin

if dfn[p^.v]=0 then

begin

tarjan(p^.v);

low[u]:=min(low[u],low[p^.v]);

endelse if instack[p^.v] then low[u]:=min(low[u],dfn[p^.v]);

p:=p^.next;

end;

if low[u]=dfn[u] then

begin

ans:=ans+1;

writeln('case #',ans,':');

repeat

top:=top-1;v:=stack[top];

write(v,' ');

instack[v]:=false;

until u=v;

writeln;

end;

end;

procedure build(x,y:longint);

varp:point;

begin

new(p);

p^.v:=y;

p^.next:=a[x];

a[x]:=p;

end;

begin

readln(n);

top:=1;

for i:=1 to n do

begin

readln(x,y);

build(x,y);

end;

tarjan(1);

end.

Tarjan演算法詳解

tarjan演算法的用途 1.求橋和割點 2.求點和邊的雙連通分量 3.求強連通 targan演算法的流程 利用dfs來遍歷圖來構建一種數型的結構 tarjan演算法的兩個核心陣列 1 對於第一種用途 tarjan演算法原理 我們從1開始遍歷,發現6,5,4的low不小於dfn 3 故3為割點 即4...

Tarjan演算法詳解

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

Tarjan演算法詳解

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