HDU
来源:互联网 发布:新世界网络教育费用 编辑:程序博客网 时间:2024/06/05 06:19
HDU - 2196 - Computer
第一次 dfs
求出每个点到其子树叶子的最长路和次长路
第二次 dfs
求出每个点向上走的最长路
#include<bits/stdc++.h>using namespace std;const int N=1e4+7;struct Edge{ int v,d;};vector<Edge> adj[N];int mx[N],se[N],up[N];void dfs1(int u,int p){ for(Edge e : adj[u]) { int v=e.v,d=e.d; if(v==p) continue; dfs1(v,u); if(mx[v]+d>mx[u]) se[u]=mx[u],mx[u]=mx[v]+d; else if(mx[v]+d>se[u]) se[u]=mx[v]+d; }}void dfs2(int u,int p){ for(Edge e : adj[u]) { int v=e.v,d=e.d,tmp; if(v==p) continue; tmp=(mx[v]+d==mx[u]?se[u]:mx[u]); up[v]=max(tmp,up[u])+d; dfs2(v,u); }}int main(){ int n; while(~scanf("%d",&n)) { memset(mx,0,sizeof(mx)); memset(se,0,sizeof(se)); memset(up,0,sizeof(up)); for(int i=1;i<=n;++i) adj[i].clear(); for(int v=2;v<=n;++v) { int u,d; scanf("%d%d",&u,&d); adj[u].push_back({v,d}); adj[v].push_back({u,d}); } dfs1(1,0); dfs2(1,0); for(int i=1;i<=n;++i) printf("%d\n",max(mx[i],up[i])); } return 0;}
阅读全文
0 0