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.

Download