标签:树形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