SAFENET2 - Mạng máy tính an toàn
Tác giả: RR
Ngôn ngữ: Pascal
{$R+,Q+}
uses math;
const
FINP='';
FOUT='';
MAXN=30001;
type
list=^node;
node=record
u:longint;
next:list;
end;
var
f1,f2:text;
stp,top,kq,count,n,m:longint;
ke:array[1..MAXN] of list;
stack,sl,father,low,num:array[1..MAXN] of longint;
procedure openF;
begin
assign(f1,FINP); reset(f1);
assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
close(f1); close(f2);
end;
procedure add(u:longint; var a:list);
var
p:list;
begin
new(p); p^.u:=u;
p^.next:=a; a:=p;
end;
procedure inp;
var
i,u,v:longint;
begin
read(f1,n,m);
for i:=1 to m do
begin
read(f1,u,v);
add(u,ke[v]);
add(v,ke[u]);
end;
end;
procedure dfs(u:longint);
var
p:list;
v,i,x:longint;
begin
inc(count); low[u]:=count; num[u]:=count;
p:=ke[u];
while p<>nil do
begin
v:=p^.u; p:=p^.next;
if num[v]=0 then
begin
father[v]:=u;
inc(top); stack[top]:=v;
dfs(v);
low[u]:=min(low[u],low[v]);
if low[v]>=num[u] then
begin
inc(stp);
repeat
x:=stack[top]; dec(top);
inc(sl[stp]);
until x=v;
end;
end
else if v<>father[u] then low[u]:=min(low[u],num[v]);
end;
end;
procedure solve;
var
i:longint;
begin
count:=0; kq:=0; top:=0; stp:=0;
for i:=1 to n do
if num[i]=0 then dfs(i);
for i:=1 to n do
kq:=max(kq,sl[i]+1);
end;
procedure ans;
begin
writeln(f2,kq);
end;
begin
openF;
inp;
solve;
ans;
closeF;
end.