| ||||||||||
| 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 | |||||||||
贴个pascal的type
arr=record
di,front:longint;
end;
var
a,b:array[0..500000] of arr;
head,head1,dfn,low,vis,col,c,fa,father,de:array[0..200000] of longint;
f:array[0..200000,0..20] of longint;
n,m,mm,i,j,x,y,ans,color,time,top,q,po,cases,ques,xx,yy:longint;
procedure addedge(x,y:longint);
begin
inc(m); a[m].di:=y; a[m].front:=head[x]; head[x]:=m;
inc(m); a[m].di:=x; a[m].front:=head[y]; head[y]:=m;
end;
procedure addedge1(x,y:longint);
begin
inc(mm); b[mm].di:=y; b[mm].front:=head1[x]; head1[x]:=mm;
end;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
procedure tarjan(k,fa:longint);
var
q,po:longint;
begin
inc(time); dfn[k]:=time; low[k]:=time; vis[k]:=1;
inc(top); c[top]:=k; q:=head[k];
while q>-1 do
begin
po:=a[q].di;
if q xor 1<>fa
then
if vis[po]=0
then
begin
tarjan(po,q);
low[k]:=min(low[k],low[po]);
end
else
if vis[po]=1
then low[k]:=min(low[k],dfn[po]);
q:=a[q].front;
end;
if dfn[k]=low[k]
then
begin
inc(color);
while c[top]<>k do
begin
col[c[top]]:=color;
vis[c[top]]:=2;
dec(top);
end;
col[c[top]]:=color;
vis[c[top]]:=2;
dec(top);
end;
end;
procedure dfs(k,fa:longint);
var
q,po:longint;
begin
vis[k]:=1; father[k]:=fa; de[k]:=de[fa]+1;
q:=head1[k];
while q>-1 do
begin
po:=b[q].di;
if vis[po]=0 then dfs(po,k);
q:=b[q].front;
end;
end;
procedure make;
var
i,j:longint;
begin
for i:=1 to color do f[i,0]:=father[i];
for i:=0 to 20 do f[0,i]:=0;
for j:=1 to 20 do
for i:=1 to color do
f[i,j]:=f[f[i,j-1],j-1];
end;
function find(k:longint):longint;
begin
if fa[k]=k then exit(k);
fa[k]:=find(fa[k]);
find:=fa[k];
end;
function lca(u,v:longint):longint;
var
t,i:longint;
begin
t:=de[u]-de[v];
for i:=0 to 20 do
if t and (1 shl i)>0 then u:=f[u,i];
if u=v then exit(u);
for i:=20 downto 0 do
if (1 shl i<=de[x]-1) and (f[u,i]<>f[v,i])
then begin u:=f[u,i]; v:=f[v,i]; end;
lca:=f[u,0];
end;
procedure work(u,v,lca:longint);
var
t1,t2:longint;
begin
while u<>lca do
begin
t1:=find(u); t2:=father[t1];
if de[t2]<de[lca] then break;
if t1=1 then break;
dec(ans);
fa[t1]:=find(t2);
u:=t2;
end;
while v<>lca do
begin
t1:=find(v); t2:=father[t1];
if de[t2]<de[lca] then break;
if t1=1 then break;
dec(ans);
fa[t1]:=find(t2);
v:=t2;
end;
end;
begin
cases:=0;
while true do
begin
readln(n,mm);
if (n=0) and (mm=0) then halt;
inc(cases);
m:=-1; time:=0; top:=0; color:=0;
for i:=1 to n do
begin
vis[i]:=0; head[i]:=-1; col[i]:=0;
end;
for i:=1 to mm do
begin
read(x,y);
addedge(x,y);
end;
tarjan(1,-1);
for i:=1 to color do
begin
head1[i]:=-1; vis[i]:=0;
end;
mm:=-1;
for i:=1 to n do
begin
q:=head[i];
while q>-1 do
begin
po:=a[q].di;
if col[i]<>col[po] then addedge1(col[i],col[po]);
q:=a[q].front;
end;
end;
if cases>1 then writeln;
writeln('Case ',cases,':');
ans:=color-1;
for i:=1 to color do fa[i]:=i;
de[0]:=0; fa[0]:=0;
dfs(1,0);
make;
readln(ques);
while ques>0 do
begin
dec(ques);
readln(xx,yy);
if de[col[xx]]>de[col[yy]]
then begin x:=col[xx]; y:=col[yy]; end
else begin y:=col[xx]; x:=col[yy]; end;
work(x,y,lca(x,y));
writeln(ans);
end;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator