首页 > 代码库 > BZOJ 1023

BZOJ 1023

program bzoj1023;uses math;const inf=1000000000;    maxn=50005;    maxm=20000005;    type edge=record    togo,next:longint;end;    var n,m,cnt,ind,ans,l,r:longint;    last,deep,f,low,dfn,fa:array [0..maxn] of longint;    a,q:array [0..maxn*2] of longint;    e:array [0..maxm] of edge;procedure insert(u,v:longint);begin  inc(cnt);  e[cnt].togo:=v; e[cnt].next:=last[u]; last[u]:=cnt;  inc(cnt);  e[cnt].togo:=u; e[cnt].next:=last[v]; last[v]:=cnt;end;procedure dp(root,x:longint);var tot,i:longint;begin    tot:=deep[x]-deep[root]+1;    i:=x;    while i<>root do        begin            a[tot]:=f[i];            dec(tot);            i:=fa[i];        end;    a[tot]:=f[root];    tot:=deep[x]-deep[root]+1;    for i:=1 to tot do         a[i+tot]:=a[i];    q[1]:=1; l:=1; r:=1;    for i:=2 to (tot shl 1) do        begin            while (l<=r) and (i-q[l]>(tot shr 1)) do            inc(l);            ans:=max(ans,a[i]+i+a[q[l]]-q[l]);            while (l<=r) and (a[q[r]]-q[r]<=a[i]-i) do                dec(r);            inc(r);            q[r]:=i;        end;    for i:=2 to tot do     f[tot]:=max(f[root],a[i]+min(i-1,tot-i+1));end;procedure dfs(x:longint);var i:longint;begin    inc(ind);    low[x]:=ind;    dfn[x]:=ind;    i:=last[x];    while i<>0 do        begin          if e[i].togo<>fa[x] then             begin                if dfn[e[i].togo]=0 then                     begin                        fa[e[i].togo]:=x;                        deep[e[i].togo]:=deep[x]+1;                        dfs(e[i].togo);                        low[x]:=min(low[x],low[e[i].togo]);                    end                else                    low[x]:=min(low[x],dfn[e[i].togo]);                if dfn[x]<low[e[i].togo] then                     begin                      ans:=max(ans,f[x]+f[e[i].togo]+1);                      f[x]:=max(f[x],f[e[i].togo]+1);                    end;            end;          i:=e[i].next;        end;    i:=last[x];    while i<>0 do         begin          if (fa[e[i].togo]<>x) and (dfn[x]<dfn[e[i].togo]) then          dp(x,e[i].togo);          i:=e[i].next;        end;end;procedure main;var i,j,a,b,k:longint;begin    read(n,m);    for i:=1 to m do         begin            read(k,a);            for j:=2 to k do             begin                read(b);                insert(a,b);                a:=b;            end;        end;    dfs(1);    writeln(ans);end;begin      main;end.

 

BZOJ 1023