由于Tarjan通常是嵌套在其他题中,所以给个求dfs序时候的模板吧~
procedure dfs(u:longint);
begin
dfn[u]:=time; inc(time);
low[u]:=dfn[u];
push[u]//把u放到栈里
visited[u]:=true;
instack[u]:=true;
i:=headlist[u];
while i<>-1 do
begin
if not(visited[t[i]]) then begin
dfs(t[i]);
low[v]:=min(low[v],low[w]);
end
else if instack[t[i]] then low[v]:=min(low[v],dfn[t[i]]);
i:=next[i];
end;
if dfn[u]=low[u] then begin
inc(scc_cnt);
repeat
v:=stack[top];
belong[v]:=scc_cnt;
pop;
instack[v]:=false;
until u=v;
end;
end;