Pagini recente » Cod sursa (job #2035169) | Cod sursa (job #1672858) | Cod sursa (job #1486354) | Cod sursa (job #3005396) | Cod sursa (job #283898)
Cod sursa(job #283898)
//Arhiva educationala - Componente tare conexe - Tarjan
type
adresa = ^nod;
nod = record inf : longint; adr : adresa; end;
var
n,m,nst,i,x,y, nr : longint;
q : adresa;
v, cnx : array [1..100000] of adresa;
idx,low, st: array[1..100000] of longint;
f : text;
function min (x,y: longint) : longint;
begin
if (x <= y) then min := x else min := y;
end;
procedure tarjan (k, id: longint);
var
q : adresa;
t,id2 : longint;
begin
idx [k] := id;
low [k] := id;
inc (nst); st[nst] := k;
q := v [k];
while (q <> nil) do
begin
if (idx[q^.inf] >= 0) then
begin
if (idx[q^.inf] = 0) then
tarjan(q^.inf, id + 1);
low[k] := min (low[k], low[q^.inf]);
end;
q := q^.adr;
end;
if (low[k] = idx[k]) then
begin
inc (nr);
repeat
t:= st[nst]; dec(nst);
id2 := idx[t]; idx[t] := -1;
new(q); q^.inf := t; q^.adr := cnx[nr]; cnx[nr] := q;
until id2 = low[t];
end;
end;
begin
assign (f, 'ctc.in');
reset (f);
readln (f, n, m);
for i:=1 to m do
begin
readln (f, x, y);
new (q); q^.inf := y; q^.adr := v[x]; v[x] := q;
end;
close (f);
nst :=0;
for i:=1 to n do
if (idx[i] = 0) then
tarjan (i, 1);
assign (f, 'ctc.out');
rewrite (f);
writeln (f, nr);
for i:=1 to nr do
begin
q := cnx[i];
while (q<> nil) do
begin
write(f,q^.inf, ' ');
q:= q^.adr;
end;
writeln(f);
end;
close (f);
end.