tarjan算法pascal代码

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;

以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。

相关