| ||||||||||
| 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 | |||||||||
路过的大牛帮帮忙.. why RE???const
maxq=1000;
maxn=100000;
maxm=200000;
start=1;
type
pointer=^Rec;
rec=record
k,num,me:longint;
next:pointer;
end;
var
n,m,q,ii:longint;
ans:array[start..maxq]of longint;
deep,r,father:array[start..maxn]of longint;
que:array[start..maxq,1..2]of longint;
edge:array[start..maxm,1..2]of longint;
link,link_r,link2,ro:array[start..maxn]of pointer;
cover:array[start..maxn]of boolean;
cover_m:array[start..maxm]of boolean;
procedure creat(i,j,k:longint);
var
p:pointer;
begin
new(p); p^.k:=k; p^.me:=j; p^.num:=i; p^.next:=link[j]; link[j]:=p;
end;
procedure creat2(i,j,k:longint);
var
p:pointer;
begin
new(p); p^.k:=k; p^.num:=i; p^.next:=link2[j]; p^.me:=j; link2[j]:=p;
end;
procedure init;
var
p,p2:pointer;
i,j,k:longint;
begin
readln(n,m);
if n=0 then halt;
for i:=1 to n do
begin
p:=link[i];
while p<>nil do
begin
p2:=p^.next;
dispose(p);
p:=p2;
end;
end;
for i:=1 to n do
begin
p:=link_r[i];
while p<>nil do
begin
p2:=p^.next;
dispose(p);
p:=p2;
end;
end;
for i:=1 to n do ro[i]:=nil;
for i:=1 to n do link2[i]:=nil;
for i:=1 to n do link_r[i]:=nil;
for i:=1 to n do link[i]:=nil;
for i:=1 to m do
begin
readln(j,k);
edge[i,1]:=j;
edge[i,2]:=k;
if j=k then continue;
creat(i,j,k);
creat(i,k,j);
end;
readln(q);
for i:=1 to q do
begin
readln(que[i,1],que[i,2]);
creat2(i,que[i,1],que[i,2]);
creat2(i,que[i,2],que[i,1]);
end;
end;
procedure find(i,d:longint);
var
p:pointer;
begin
deep[i]:=d;
cover[i]:=true;
p:=link[i];
while p<>nil do
begin
if not cover_m[p^.num] then
begin
if not cover[p^.k] then
begin
cover_m[p^.num]:=true;
find(p^.k,d+1);
end;
if deep[p^.k]<=deep[i] then
begin
r[i]:=r[p^.k];
deep[i]:=deep[p^.k];
end;
end;
p:=p^.next;
end;
end;
function get_f(i:longint):longint;
var
p:pointer;
begin
cover[i]:=true;
if r[i]=i then
get_f:=i else
begin
get_f:=get_f(r[i]);
r[i]:=get_f;
end;
end;
function getfather(i:longint):longint;
begin
if father[i]=i then exit(i);
getfather:=getfather(father[i]);
father[i]:=getfather;
end;
procedure LCA(i:longint);
var
p,p2:pointer;
begin
cover[i]:=true;
p:=link_r[i];
while p<>nil do
begin
p2:=link2[p^.k];
while p2<>nil do
begin
if cover[r[p2^.k]] then
begin
ans[p2^.num]:=getfather(r[p2^.k]);
end;
{if not cover[r[p2^.k]] then
begin
LCA(r[p2^.k]);
ro[r[p2^.k]]:=p2;
father[r[p2^.k]]:=i;
end;}
p2:=p2^.next;
end;
p:=p^.next;
end;
p:=link_r[i];
while p<>nil do
begin
p2:=link[p^.k];
while p2<>nil do
begin
if not cover[r[p2^.k]] then
begin
LCA(r[p2^.k]);
ro[r[p2^.k]]:=p2;
father[r[p2^.k]]:=i;
end;
p2:=p2^.next;
end;
p:=p^.next;
end;
end;
function check(i,a:longint):longint;
var
p:pointer;
begin
check:=0;
if (i=a)or(father[i]=father[a]) then exit;
p:=ro[father[i]];
repeat
if check<>0 then p:=ro[r[p^.me]];
inc(check);
father[r[p^.k]]:=a;
until father[r[p^.me]]=a;
end;
procedure main;
var
p:pointer;
i,nn,j,k,jj,kk:longint;
begin
fillchar(deep,sizeof(deep),0);
fillchar(cover,sizeof(cover),false);
fillchar(cover_m,sizeof(cover_m),false);
for i:=1 to n do r[i]:=i;
find(1,0);
fillchar(cover,sizeof(cover),false);
for i:=1 to n do if not cover[i] then get_f(i);
for i:=1 to n do
begin
new(p); p^.k:=i; p^.next:=link_r[r[i]]; link_r[r[i]]:=p;
end;
for i:=1 to n do father[i]:=i;
fillchar(cover,sizeof(cover),false);
LCA(1);
nn:=0;
fillchar(cover,sizeof(cover),false);
for i:=1 to n do cover[r[i]]:=true;
for i:=1 to n do if cover[i] then inc(nn);
dec(nn);
for i:=1 to n do father[i]:=i;
for i:=1 to q do
begin
j:=r[que[i,1]]; k:=r[que[i,2]];
jj:=check(j,ans[i]);
kk:=check(k,ans[i]);
nn:=nn-jj-kk;
writeln(nn);
end;
end;
begin
ii:=0;
while true do
begin
init;
inc(ii);
if ii<>1 then writeln;
writeln('Case ',ii,':');
main;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator