-
C - Computer
- HDU - 2196
- 每个节点的最长距离可由父节点的最长距离,和子节点的最长距离(取最大)决定。
- 先用一个dfs求出各节点由各子树确定的最长距离,次长距离,并且记录最长距离是由哪个子节点更新来的。
- 再用一个dfs由父节点推各子节点的最长距离。
-
#include<bits/stdc++.h> using namespace std; #define maxn 10086 #define inf 0x3f3f3f3f int dp[maxn],lowdp[maxn],a,b; int pre[maxn],best[maxn],n; struct node { int v,w; }; vector<node>edge[maxn]; int dfs(int root) { int len=edge[root].size(); if(len==0) return 0; if(dp[root])return dp[root]; int bestson; for(int i=0; i<len; i++) { int son=edge[root][i].v; int cost=edge[root][i].w; if(dfs(son)+cost>dp[root]) { lowdp[root]=dp[root]; dp[root]=dp[son]+cost; bestson=son; } else if(dp[son]+cost>lowdp[root]) lowdp[root]=dp[son]+cost; } best[root]=bestson; return dp[root]; } void dfs1(int root) { int len=edge[root].size(); for(int i=0; i<len; i++) { int son=edge[root][i].v; int cost=edge[root][i].w; if(son==best[root]) pre[son]=max(pre[root],lowdp[root])+cost; else pre[son]=max(pre[root],dp[root])+cost; dfs1(son); } } int main() { while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { edge[i].clear(); dp[i]=pre[i]=lowdp[i]=0; } for(int i=2; i<=n; i++) { scanf("%d%d",&a,&b); edge[a].push_back((node){i,b}); } dfs(1); dfs1(1); for(int i=1;i<=n;i++) printf("%d\n",max(pre[i],dp[i])); } return 0; }
C - Computer HDU - 树形DP-叶-根-叶
最新推荐文章于 2021-03-06 21:50:37 发布