标签:树形dp
5 1 1 2 1 3 1 1 1
3 2 3 4 4
其实就是 递归的应用,不够看别人思路挺新颖的
http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
using namespace std;
#define N 10005
int head[N],num,n;
int big[N],small[N];
int bigid[N],smallid[N];
struct stud{
int to,len;
int next;
}e[N*2];
inline void add(int s,int to,int len)
{
e[num].to=to;
e[num].len=len;
e[num].next=head[s];
head[s]=num++;
}
void dfs1(int x,int father)
{
big[x]=small[x]=0;
int i;
for(i=head[x];i!=-1;i=e[i].next)
{
int to=e[i].to;
if(to==father) continue;
dfs1(to,x);
if(big[to]+e[i].len>small[x])
{
small[x]=big[to]+e[i].len;
smallid[x]=to;
if(small[x]>big[x])
{
swap(small[x],big[x]);
swap(smallid[x],bigid[x]);
}
}
}
}
void dfs2(int x,int father)
{
int i;
for(i=head[x];i!=-1;i=e[i].next)
{
int to=e[i].to;
if(to==father) continue;
if(bigid[x]==to)
{
if(small[x]+e[i].len>small[to])
{
small[to]=small[x]+e[i].len;
smallid[to]=x;
if(small[to]>big[to])
{
swap(big[to],small[to]);
swap(bigid[to],smallid[to]);
}
}
}
else
{
if(big[x]+e[i].len>small[to])
{
small[to]=big[x]+e[i].len;
smallid[to]=x;
if(small[to]>big[to])
{
swap(big[to],small[to]);
swap(bigid[to],smallid[to]);
}
}
}
dfs2(to,x);
}
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
memset(head,-1,sizeof(head));
int len,to;
num=0;
for(i=2;i<=n;i++)
{
scanf("%d%d",&to,&len);
add(i,to,len);
add(to,i,len);
}
dfs1(1,-1);
dfs2(1,-1);
for(i=1;i<=n;i++)
printf("%d\n",big[i]);
}
return 0;
}
标签:树形dp
原文地址:http://blog.csdn.net/u014737310/article/details/43940313