jzoj P1752 无聊的草稿___dfs+树的最长链

题目大意:

图中有N个点,每两点间只有唯一的路径,对于这样一个给定的图,最大的“毛毛虫”会有多大。毛毛虫包含一条主链,毛毛虫中的节点,要不在主链上,要么和主链上某节点相邻,如下图所示有两只合法的毛毛虫,点数越多,毛毛虫越大。
jzoj P1752 无聊的草稿___dfs+树的最长链_第1张图片
  1. 对于20%的数据,N≤200
  2. 对于40%的数据,N≤5000
  3. 对于100%的数据,N≤10^6

题解:

这题其实就是树的最长链的一个变形,每个节点的贡献长度不是1而已,用sum[i]存i节点连的边,然后做2遍dfs求出最长链即可。
因为任意两点之间路径唯一,所以最长链上的点的sum[i]累加总和可直接做。

代码:

var
    list,sum:array [0..1000001] of longint;
    next,t:array [0..2000001] of longint;
    max:array [1..3] of longint;
    i,n,m,p,x,y:longint;

procedure add(kx,ky,kz:longint);
begin
    inc(sum[ky]);
    t[kx]:=kz;
    next[kx]:=list[ky];
    list[ky]:=kx;
end;

procedure dfs(dep,now,rp:longint);
var
    i:longint;
begin
    if now>max[1] then
    begin
         max[1]:=now;
         max[2]:=dep;
    end;
    if dep=0 then exit;
    i:=list[dep];
    while i>0 do
    begin
        if t[i]<>rp then dfs(t[i],now+sum[t[i]]-1,dep);
        i:=next[i];
    end;
end;

begin
    readln(n,m);
    for i:=1 to m do
    begin
         readln(x,y);
         inc(p); add(p,x,y);
         inc(p); add(p,y,x);
    end;
    max[1]:=0;
    max[2]:=0;
    dfs(1,sum[1]+1,0);
    max[1]:=0;
    dfs(max[2],sum[max[2]]+1,0);
    writeln(max[1]);
end.

你可能感兴趣的:(jzoj P1752 无聊的草稿___dfs+树的最长链)