tarjan算法pascal代码procedure tarjan(x:longint);var i,j,k:longint;begin inc(h); dfn[x]:=h;low[x]:=h;//dfn,low初始化,记录访问该点的真实时间dfn和最早时间low inc(t); f[t]:=x;//当前元素入栈 s[x]:=true;ss[x]:=true;//s,ss标记 for i:=1 to 200 do if p[x,i] then begin//枚举每一条边 if not s[i] then begin tarjan(i);//如果节点i未被访问过继续向下找 low[x]:=min(low[x],low[i]); end else if ss[i] then low[x]:=min(low[x],dfn[i]);//如果节点i还在栈内 end; if dfn[x]=low[x] then//如果s的最早访问时间等于其实际访问时间,则可把其视作回路的"始点" begin inc(ans);//连通块编号 while f[t+1]<>x do//将由x直接或间接扩展出的点标记为同一连通块,标记访问后出栈 begin ss[f[t]]:=false; dec(t); end; end;//如果节点x是强连通分量的根,退栈直到x的前一个数据,记录这个强连通分量的数据end;
以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。