| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
人生第一道强连通分量,调了两个小时,终于AC了。。。(以下附代码PASCAL版)type
node=record
p,link:longint;
end;
var head,f,s,c,dfn,low,oud:array[1..10000] of longint;
edge:array[1..50000] of node;
vis,inner:array[1..10000] of boolean;
n,m,top,time,count:longint;
procedure init;
var i,a,b:longint;
begin
readln(n,m);
for i:=1 to m do
begin
readln(a,b);
edge[i].p:=b;
edge[i].link:=head[a];
head[a]:=i;
end;
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure tarjan(x:longint);
var k:longint;
begin
inc(top);
s[top]:=x;
inner[x]:=true;
inc(time);
dfn[x]:=time;
low[x]:=time;
k:=head[x];
while k<>0 do
begin
if not vis[edge[k].p] then
begin
vis[edge[k].p]:=true;
tarjan(edge[k].p);
low[x]:=min(low[x],low[edge[k].p]);
end
else
if inner[edge[k].p] then low[x]:=min(low[x],dfn[edge[k].p]);
k:=edge[k].link;
end;
if dfn[x]=low[x] then
begin
inc(count);
c[count]:=0;
repeat
inner[s[top]]:=false;
f[s[top]]:=count;
inc(c[count]);
dec(top);
until s[top+1]=x;
end;
end;
procedure work;
var i,k:longint;
begin
fillchar(vis,sizeof(vis),false);
fillchar(inner,sizeof(inner),false);
top:=0;
time:=0;
count:=0;
fillchar(dfn,sizeof(dfn),0);
for i:=1 to n do
if dfn[i]=0 then begin vis[i]:=true; tarjan(i); end;
fillchar(oud,sizeof(oud),0);
for i:=1 to n do
begin
k:=head[i];
while k<>0 do
begin
if f[i]<>f[edge[k].p] then inc(oud[f[i]]);
k:=edge[k].link;
end;
end;
end;
procedure print;
var i,t,v:longint;
begin
t:=0;
for i:=1 to count do
if oud[i]=0 then begin inc(t); v:=i; end;
if t=1 then writeln(c[v]) else writeln(0);
end;
begin
init;
work;
print;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator