| ||||||||||
| 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 | |||||||||
为何WAvar a,aa:array[1..15000,1..2]of longint;
b,d,bb,dd,f,color,ans:array[1..5005]of longint;
ff:array[1..5001]of boolean;
i,j,k,n,m,num,date,nn,mm:longint;
procedure qsort(s,t:longint);
var i,j,x,xx:longint;
begin
i:=s;j:=t;x:=a[(s+t) shr 1,1];xx:=a[(s+t) shr 1,2];
a[(s+t) shr 1]:=a[s];
repeat
while (i<j) and (a[j,1]>=x) do dec(j);
if j>i then a[i]:=a[j];
while (i<j) and (a[i,1]<=x) do inc(i);
if j>i then a[j]:=a[i];
until i=j;
a[i,1]:=x;a[i,2]:=xx;
inc(i);dec(j);
if i<t then qsort(i,t);
if j>s then qsort(s,j);
end;
procedure dfs(x:longint);
var i:longint;
begin
color[x]:=1;
for i:=b[x] to b[x+1]-1 do
if color[a[i,2]]=0 then dfs(a[i,2]);
color[x]:=2;
inc(date);
d[x]:=date;
end;
procedure dfs1(x:longint);
var i,j:longint;
begin
f[x]:=nn;
for i:=b[x] to b[x+1]-1 do
if f[a[i,2]]=0 then dfs1(a[i,2]);
end;
procedure build;
var i,j:longint;
begin
fillchar(b,sizeof(b),0);
if m>1 then qsort(1,m);
for i:=1 to m do
if b[a[i,1]]=0 then b[a[i,1]]:=i;
b[n+1]:=m+1;
for i:=n downto 1 do
if b[i]=0 then b[i]:=b[i+1];
end;
procedure main;
begin
fillchar(d,sizeof(d),0);
fillchar(color,sizeof(color),0);
fillchar(f,sizeof(f),0);
num:=0;
for i:=1 to m do read(a[i,1],a[i,2]);
build;
date:=0;
for i:=1 to n do
if color[i]=0 then dfs(i);
aa:=a;
bb:=b;
for i:=1 to m do
begin
k:=a[i,1];
a[i,1]:=a[i,2];
a[i,2]:=k;
end;
build;
for i:=1 to n do
dd[d[i]]:=i;
nn:=0;mm:=0;
for i:=n downto 1 do
if f[dd[i]]=0 then
begin
inc(nn);
dfs1(dd[i]);
end;
for i:=1 to n do
for j:=bb[i] to bb[i+1]-1 do
if f[aa[j,1]]<>f[aa[j,2]] then
begin
inc(mm);
a[mm,1]:=f[aa[j,1]];
a[mm,2]:=f[aa[j,2]];
end;
fillchar(b,sizeof(b),0);
if mm>1 then qsort(1,mm);
for i:=1 to mm do
if b[a[i,1]]=0 then b[a[i,1]]:=i;
fillchar(ff,sizeof(ff),false);
for i:=1 to nn do
if b[i]=0 then ff[i]:=true;
for i:=1 to n do
if ff[f[i]] then
begin
inc(num);
ans[num]:=i;
end;
for i:=1 to num-1 do write(ans[i],' ');
writeln(ans[num]);
end;
begin
assign(input,'e:\a.in');
assign(output,'e:\a.out');
reset(input);
rewrite(output);
read(n);
while n<>0 do
begin
readln(m);
main;
read(n);
end;
close(input);
close(output);
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator