HDU 2196 Computer (经典树形DP)

来源:互联网 发布:怎么取消mac在线 编辑:程序博客网 时间:2024/05/16 18:28

本文出自点击打开链接

本人代码:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100005;struct Nod{    int b,val,next;    void init(int b,int val,int next){        this->b = b;this->val = val;this->next = next;    }}buf[maxn<<1];int len,E[maxn];int n,dp[maxn][3];void init(){    len = 0;    memset(E,-1,sizeof(E));    memset(dp,0,sizeof(dp));}void add_Edge(int a,int b,int val){    buf[len].init(b,val,E[a]);E[a]=len++;    buf[len].init(a,val,E[b]);E[b]=len++;}void dfsOne(int u,int pre){    int i,v,cost;    for(i = E[u] ; i != -1 ; i = buf[i].next){        v = buf[i].b;cost = buf[i].val;        if(v == pre) continue;        dfsOne(v,u);        if(dp[u][0] < dp[v][0] + cost){ dp[u][1] = dp[u][0];dp[u][0] = dp[v][0] + cost;}        else if(dp[u][1] < dp[v][0] + cost) dp[u][1] = dp[v][0] + cost;    }}void dfsTwo(int u,int pre){    int i,dist;    for(i = E[u] ; i != -1 ; i = buf[i].next)    if(buf[i].b == pre) { dist = buf[i].val;break; }    if(pre != -1){        if(dist + dp[u][0] == dp[pre][0]){            dp[u][2] = dist + max(dp[pre][1],dp[pre][2]);        }else dp[u][2] = dist + max(dp[pre][0],dp[pre][2]);    }    //cout<<u<<" "<<pre<<" "<<dist<<" "<<dp[u][2]<<endl;    for(i = E[u] ; i != -1 ; i = buf[i].next)        if(buf[i].b != pre) dfsTwo(buf[i].b,u);}int main(){    while(~scanf("%d",&n)){        int i,b,val;        init();        for(i = 2; i <= n ; i++){            scanf("%d%d",&b,&val);            add_Edge(i,b,val);        }        dfsOne(1,-1);        dfsTwo(1,-1);        for(int i = 1;i <= n; i++)            //cout<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl;            printf("%d\n",max(dp[i][0],dp[i][2]));    }    return 0;}


0 0
原创粉丝点击