Tarjan Pascal程序

本文详细介绍了Tarjan算法的C++实现过程,包括如何使用C++编程语言解决图论问题,具体展示了如何通过递归和栈操作来计算强连通分量,并提供了实例代码。
program tarjan;

Var
 a:array[0..1000,0..1000] of boolean;
 stack,dfn,low:array[0..1000] of longint;
 v:array[0..1000] of boolean;
 top,all,i,p,q,n,m:longint;

Procedure fopen;
  begin
  assign(input,'tarjan.in');
  assign(output,'tarjan.out');
  reset(input);
  rewrite(output);
end;

Procedure fclose;
  begin
  close(input);
  close(output);
end;

Function min(a,b:longint):longint;
  begin
  if a<b then exit(a) else exit(b);
end;

Procedure tarjan(P:longint);
var
 i:longint;
  begin
  Writeln('Enter P=',p,' low[p]=dfn[p]=',all+1);
  inc(all);
  low[p]:=all;
  dfn[p]:=all;
  inc(top);
  stack[top]:=p;
  v[p]:=true;
  for i:=1 to n do
    if a[p,i] then
      begin
      if dfn[i]=0 then begin tarjan(i); low[p]:=min(low[p],low[i]);end else if v[i] then 
      low[p]:=min(low[p],low[i]);
    end;
  if low[p]=dfn[p] then
    repeat
    v[stack[top]]:=false;
    writeln(p,':',stack[top]);
    dec(top);
  until stack[top+1]=p;
  writeln('Exit P=',p,' low[p]=',low[p],' dfn[p]=',dfn[p]);
end;
  
  begin
  fopen;
  readln(n,m);
  fillchar(a,sizeof(a),false);
  fillchar(v,sizeof(v),false);
  all:=0;top:=0;
  for i:=1 to m do
    begin
    readln(p,q);
    a[p,q]:=true;
  end;
  for i:=1 to n do
    if dfn[i]=0 then tarjan(i);
  fclose;
end.

 

转载于:https://www.cnblogs.com/htfy/archive/2012/11/10/2764451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值