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;}