机器选择
selc
【题目描述】
自从省队NOI赛前集训在scz举行之后,一个名叫cs1.6.exe的文件开始在机房广泛使用起来。每天大家都要找神犇小X借移动硬盘,考里面的这个文件。
由于机房里需要考这个文件的人太多了,每天都要花一段时间一个人一个人的去拷贝。小T觉得这实在是太麻烦了,就想找一个一劳永逸的方法。
小T调查了一下,机房有n台机器,且有局域网,所有机器通过一些网线连接起来,其整个布局是一个树形结构,即任意两台机器间都有且仅有一条路径。小T想在其中某一台机器上储存这个文件,需要的同学就可以直接通过局域网来下载这个文件。
网络上信息传输是需要时间的,我们定义两台机器间数据传输的时间为连接这两台机器的路径所包含的网线数量。虽然机房里通过局域网传个文件是很快的,但对于急不可耐的同学们来说,一分一秒都是宝贵的,文件传输越快越好。所以小T要选择一台机器存储文件,使得所有机器下载这个文件需要的总时间(即最后一台机器完成下载的时间)尽可能短。
现在,你需要给出这个最短时间,以便让小T看看他的决策是否最优。
【输入数据】
从selc.in中读入数据。
第1行:一个整数n。
第2~n行:两个整数u、v,即u、v两台机器间有一条网线连接。机器从1~n编号。
输入数据保证是一个连通的树型结构。
【输出数据】
向selc.out中输出数据。
1行一个整数,即最短的时间。
【数据范围】
对于30%的数据,n≤100;
对于50%的数据,n≤1000;
对于100%的数据,2≤n≤100000。
【输入输出样例】
selc.in | selc.out |
5 3 2 2 1 5 2 2 4 | 1 |
var from,t,next,list:array[0..200000]of longint; n,i,j,max,max2:longint; procedure try(x,y,z:longint); var i:longint; begin i:=list[x]; if y>max then begin max:=y; max2:=x; end; while i>0 do begin if t[i]<>z then try(t[i],y+1,x); i:=next[i]; end; end; begin read(n); for i:=1 to n-1 do begin inc(j); readln(from[j],t[j]); next[j]:=list[from[j]]; list[from[j]]:=j; inc(j); from[j]:=t[j-1]; t[j]:=from[j-1]; next[j]:=list[from[j]]; list[from[j]]:=j; end; try(1,0,0); max:=0; try(max2,0,0); writeln((max+1)div 2); end.