參考:
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深度優先遍...