首页 > 代码库 > 1131: [POI2008]Sta
1131: [POI2008]Sta
1131: [POI2008]Sta
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 783 Solved: 235
[Submit][Status]
Description
给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大
Input
给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.
Output
输出你所找到的点,如果具有多个解,请输出编号最小的那个.
Sample Input
8
1 4
5 6
4 5
6 7
6 8
2 4
3 4
1 4
5 6
4 5
6 7
6 8
2 4
3 4
Sample Output
7
HINT
Source
题解:一道萌萌哒树状DP,先是随便弄一个点然后建树,求出各点的深度,然后求和,然后在这个你建立的有根树上各个分支进行DP,以各个点为根时的深度并不难维护——设当前总和为X,你想转移到的子节点下属共计Y个节点(算自己),整个树N个节点,那么这次转移后的总和为X-Y+(N-Y),别的没了。。。对于P党小心202(爆栈!!!)
1 {$M 10000000,0,maxlongint} 2 type 3 point=^node; 4 node=record 5 g:longint; 6 next:point; 7 end; 8 9 var10 i,j,k,l,m,n:longint;11 a1,a2:int64;12 a:array[0..2000000] of point;13 b,c,d,e:array[0..2000000] of int64;14 procedure add(x,y:longint);inline;15 var p:point;16 begin17 if x=y then exit;18 new(p);19 p^.g:=y;20 p^.next:=a[x];21 a[x]:=p;22 end;23 procedure built(x:longint);inline;24 var p:point;25 begin26 p:=a[x];27 c[x]:=1;28 while p<>nil do29 begin30 if d[p^.g]=0 then31 begin32 d[p^.g]:=1;33 b[p^.g]:=b[x]+1;34 built(p^.g);35 c[x]:=c[x]+c[p^.g];36 end;37 p:=p^.next;38 end;39 end;40 procedure run(x:longint);inline;41 var p:point;42 begin43 p:=a[x];44 while p<>nil do45 begin46 if d[p^.g]=0 then47 begin48 d[p^.g]:=1;49 e[p^.g]:=e[x]+int64(n)-(2*c[p^.g]);50 run(p^.g);51 end;52 p:=p^.next;53 end;54 end;55 56 begin57 readln(n);58 for i:=1 to n do a[i]:=nil;59 for i:=1 to n-1 do60 begin61 readln(j,k);62 add(j,k);add(k,j);63 end;64 fillchar(b,sizeof(b),0);65 fillchar(c,sizeof(c),0);66 fillchar(d,sizeof(d),0);67 d[1]:=1;68 built(1);69 fillchar(d,sizeof(d),0);70 fillchar(e,sizeof(e),0);71 d[1]:=1;72 for i:=1 to n do e[1]:=e[1]+b[i];73 run(1);74 a1:=-1;a2:=0;75 for i:=1 to n do76 begin77 if e[i]>a1 then78 begin79 a1:=e[i];80 a2:=i;81 end;82 end;83 writeln(a2);84 readln;85 end.
1131: [POI2008]Sta
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。