【图论】【强连通分量】【Tarjan】pascal+邻接表

const
    maxn = 100000;
    maxm = 2*maxn;
var
    cost,toit,next:array[0..maxm] of longint;
    list,dfn,low,stack:array[0..maxn] of longint;   
    n,m,top,i,j,d,tot,a,b,c:longint;
    f,vis:array[0..maxn] of boolean;

procedure add(a,b,c:longint);
begin
    inc(tot);
    cost[tot]:=c;
    toit[tot]:=b;
    next[tot]:=list[a];
    list[a]:=tot;
end;

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

procedure print(x:integer);
begin
    while stack[tot]<>x do begin
        writeln(stack[tot],' ');
        f[stack[tot]]:=false;
        dec(tot);
    end;
    writeln(stack[tot]);
    f[stack[tot]]:=false;
    dec(tot);
end;

procedure dfs(x:integer);
var i,k,v:longint;
begin
    inc(d);
    dfn[x]:=d;
    low[x]:=d;
    inc(tot);
    stack[tot]:=x;
    f[x]:=true;
    k:=list[x];
    while k<>0 do begin
        v:=toit[k];
        if not vis[v] then begin
            vis[v]:=true;
            dfs(v);
            low[x]:=min(low[x],low[v]);
        end
        else if f[v] then low[x]:=min(low[x],dfn[v]);
        k:=next[k];
    end;
    if dfn[x]=low[x] then print(x);
end;

begin
    fillchar(list,sizeof(list),0);
    fillchar(next,sizeof(next),0);
    fillchar(toit,sizeof(toit),0);
    fillchar(f,sizeof(f),false);
    fillchar(vis,sizeof(vis),false);
    readln(n,m);
    tot:=0;
    for i:=1 to m do begin
        readln(a,b);
        add(a,b);
    end;    
    d:=0;tot:=0;
    for i:=1 to n do if not vis[i] then begin
        vis[i]:=true;
        dfs(i);
    end; 
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值