HDU 2196 树形dp

来源:互联网 发布:java web项目源码 编辑:程序博客网 时间:2024/05/17 07:57

题目的大意就是要你求出每个节点到叶子节点的最远距离

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

#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;#define MAXN 10008typedef 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;    }}


原创粉丝点击