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的方法