| ||||||||||
| 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 | |||||||||
极其伪的代码var
a,b,aa,bb:array[0..50001] of longint;
c,low,visit,dfn,size,f,g,h,l,ll,r,rr:array[0..5001] of longint;
n,m,nn,mm,ans,ss,num,i,j,k,time:longint;
procedure sort(l,r:longint);
var
i,j,x,y:longint;
begin
i:=l; j:=r; x:=a[(l+r) shr 1];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if not(i>j)
then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
inc(i); dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
procedure tarjan(k:longint);
var
i:longint;
begin
inc(time); low[k]:=time; dfn[k]:=time; visit[k]:=1;
inc(num); c[num]:=k;
for i:=l[k] to r[k] do
if visit[b[i]]=0
then
begin
tarjan(b[i]);
if low[b[i]]<low[k]
then low[k]:=low[b[i]];
end
else
if visit[b[i]]=1
then
begin
if dfn[b[i]]<low[k]
then low[k]:=dfn[b[i]];
end;
if low[k]=dfn[k]
then
begin
inc(nn);
size[nn]:=1;
while low[c[num]]<>dfn[c[num]] do
begin
f[c[num]]:=nn;
visit[c[num]]:=2;
inc(ss);
g[ss]:=c[num]; h[ss]:=nn;
inc(size[nn]);
dec(num);
end;
f[k]:=nn;
visit[k]:=2;
inc(ss);
g[ss]:=k; h[ss]:=nn;
dec(num);
end;
end;
begin
while true do
begin
read(n);
if n=0 then halt;
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(aa,sizeof(aa),0);
fillchar(bb,sizeof(bb),0);
fillchar(c,sizeof(c),0);
fillchar(low,sizeof(low),0);
fillchar(visit,sizeof(visit),0);
fillchar(dfn,sizeof(dfn),0);
fillchar(size,sizeof(size),0);
fillchar(f,sizeof(f),0);
fillchar(g,sizeof(g),0);
fillchar(h,sizeof(h),0);
fillchar(l,sizeof(l),0);
fillchar(ll,sizeof(ll),0);
fillchar(r,sizeof(r),0);
fillchar(rr,sizeof(rr),0);
read(m);
for i:=1 to m do
read(a[i],b[i]);
sort(1,m);
l[a[1]]:=1;
for i:=2 to m do
if a[i]<>a[i-1]
then
begin
r[a[i-1]]:=i-1;
l[a[i]]:=i;
end;
r[a[m]]:=m;
for i:=1 to n do
if r[i]=0 then r[i]:=-1;
for i:=1 to n do visit[i]:=0;
time:=0; nn:=0; num:=0; ss:=0;
for i:=1 to n do
if visit[i]=0 then tarjan(i);
mm:=0; j:=1;
for i:=1 to nn do
if h[j]=i
then
begin
for k:=1 to nn do visit[k]:=0;
visit[i]:=1;
while (j<=n) and (h[j]=i) do
begin
for k:=l[g[j]] to r[g[j]] do
if visit[f[b[k]]]=0
then
begin
visit[f[b[k]]]:=1;
inc(mm);
aa[mm]:=i;
bb[mm]:=f[b[k]];
end;
inc(j);
end;
end;
for i:=1 to nn do begin ll[i]:=0; rr[i]:=0; end;
ll[aa[1]]:=1;
for i:=2 to mm do
if aa[i]<>aa[i-1]
then
begin
rr[aa[i-1]]:=i-1;
ll[aa[i]]:=i;
end;
rr[aa[mm]]:=mm;
ss:=0;
for i:=1 to n do
if rr[f[i]]=0
then
begin
if ss=1 then write(' ');
ss:=1;
write(i);
end;
writeln;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator