您的位置:首页 > 其它

HDU 2196 树形dp

2013-05-03 19:59 176 查看
题目的大意就是要你求出每个节点到叶子节点的最远距离

这道题两次搜索,求出最大值,记录一个最大值一个次大值,便于更新

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 10008
typedef struct{
    int to,next,len;

} E;
E edge[2*MAXN];
int head[MAXN];
int tol;
int smaxn[MAXN],maxn[MAXN],smaxid[MAXN],maxid[MAXN];
void Add_Edge(int u,int v,int w){
    edge[tol].to=v;
    edge[tol].len=w;
    edge[tol].next=head[u];
    head[u]=tol++;

}
void Init(){
    tol=0;
    memset(head,-1,sizeof(head));
}
void dfs1(int u,int f){
    maxn[u]=0;
    smaxn[u]=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if(v==f)continue;
        dfs1(v,u);
        if(smaxn[u]<maxn[v]+edge[i].len){
            smaxn[u]=maxn[v]+edge[i].len;
            smaxid[u]=v;
           if(smaxn[u]>maxn[u]){
               swap(smaxn[u],maxn[u]);
               swap(smaxid[u],maxid[u]);

           }

     }

    }

}
void dfs2(int u,int s){
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if(v==s)continue;
        if(v==maxid[u]){
            if(edge[i].len+smaxn[u]>smaxn[v]){
                smaxn[v]=edge[i].len+smaxn[u];
                smaxid[v]=u;
                if(smaxn[v]>maxn[v]){
                    swap(smaxn[v],maxn[v]);
                    swap(smaxid[v],maxid[v]);

                }

            }

        }
        else {
            if(edge[i].len+maxn[u]>smaxn[v]){
                smaxn[v]=edge[i].len+maxn[u];
                smaxid[v]=u;
                if(smaxn[v]>maxn[v]){
                    swap(smaxn[v],maxn[v]);
                    swap(smaxid[v],maxid[v]);

                }

            }

        }
        dfs2(v,u);

    }

}
int main(){
    int n,v,len;
    while(cin>>n){
        Init();
        for(int i=2;i<=n;i++){
            cin>>v>>len;
            Add_Edge(i,v,len);
            Add_Edge(v,i,len);
        }
        dfs1(1,-1);
        dfs2(1,-1);
        for(int i=1;i<=n;i++)
        cout<<maxn[i]<<endl;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: