题意:对树中每个结点求其与能到达的最远结点的距离。N<=10^4
分析:先求出树的直径(树中距离最远的2个点之间路径),对每个结点,求到达直径2个端点的距离,较大的即为结果。

#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 10001 int n,e; int first[N],next[N<<1],v[N<<1],w[N<<1]; int dx[N],dy[N]; void init() { e=0; memset(first+1,-1,sizeof(first[0])*n); } void add(int a,int b,int c) { v[e]=b; w[e]=c; next[e]=first[a]; first[a]=e++; } void dfs(int a,int fa,int dist,int *d) { int i,b; for(i=first[a];~i;i=next[i]) { b=v[i]; if(b^fa) dfs(b,a,d[b]=dist+w[i],d); } } int main() { int a,b,c; while(~scanf("%d",&n)) { init(); for(a=2;a<=n;a++) { scanf("%d%d",&b,&c); add(a,b,c); add(b,a,c); } dfs(1,0,dx[1]=0,dx); int x,y; x=1; for(int i=2;i<=n;i++) { if(dx[i]>dx[x]) x=i; } dfs(x,0,dx[x]=0,dx); y=1; for(int i=2;i<=n;i++) { if(dx[i]>dx[y]) y=i; } dfs(y,0,dy[y]=0,dy); for(int i=1;i<=n;i++) printf("%d\n",max(dx[i],dy[i])); } return 0; }