题意: 求每个点的最远距离。
树形dp,做了两天,感觉就是从子节点得到父节点。
此题要用到两次dfs, 第一次dfs1用来求所有节点在他子树范围内到叶子节点的最长距离和次长距离。dp1,和dp2
第二次dfs2 ,求f【】,如果dp1[s]==dp1[x]+len (s为父节点,x为子节点),则 x 在最长树的分支上,f[x]=max(f[s]+len,dp2[s]+len);
所以f【x】就等于f父节点加上到子节点的距离和父节点的次长加上到x节点的距离的两者的最大值。
如果 不相等,则代表x节点不在父节点最长的分支上。则f【x】就等于f父节点到x节点的距离和父节点的最长距离加上到子节点距离 两者的最大值。
结果在max(f【】,dp1【】)
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 const int Max=10001; 7 struct Point 8 { 9 int v,w;10 };11 vector V[Max];12 int vis[Max];13 int f[Max],dp1[Max],dp2[Max];14 void init()15 {16 for(int i=1;i