MZOJ 1264 Longest

MZOJ 1264 Longest

#include<bits/stdc++.h>
#define maxn 5000
using namespace std;
 
int k=0,head[maxn];
int f[maxn][2];
int ans=0;
 
struct node{
    int v,w,nxt;
}e[maxn<<1];
 
void adde(int x,int y,int z){
    e[k].v=y;
    e[k].w=z;
    e[k].nxt=head[x];
    head[x]=k++;
} 
 
void init(){
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
}
 
void readdata(){
    memset(head,-1,sizeof(head));
    int n,u,v,w;
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&u,&v,&w);
        adde(u,v,w);
        adde(v,u,w);
    }
}
 
void dp(int u,int fa){
    f[u][0]=0;
    f[u][1]=0;
    for(int i=head[u];~i;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if (v==fa) continue;
        dp(v,u);
        int dis=f[v][0]+w;
        if(dis>f[u][0]){
            f[u][1]=f[u][0];
            f[u][0]=dis;
        }
        else if(dis>f[u][1]){
            f[u][1]=dis;
        }
        ans=max(ans,f[u][1]+f[u][0]);
    }
}
 
int main(){
    //init();
    readdata();
    dp(1,0);
    printf("%d",ans);
    return 0;
}

树形DP的方法

原文地址:https://www.cnblogs.com/quietus/p/10300077.html