【题意】:给出一棵树, 每条边有一个权值 求离每个节点最远的点的权值和
看这篇题解学会的 http://tech.ddvip.com/2013-09/1379006959202653.html
树形dp也蛮有趣的 ^ ^
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 8 struct node{int v;int w;}; 9 10 vector<node>no[10002]; 11 __int64 ff[10002][2]; 12 bool vis[10002]; 13 14 void dfs1(int u,int f) 15 { 16 vis[u]=true; 17 for(int i=0;i<no[u].size();i++) 18 { 19 int vv=no[u][i].v; 20 int ww=no[u][i].w; 21 if(vis[vv]) 22 continue; 23 if(vv!=f) 24 { 25 dfs1(vv,u); 26 if(ff[u][0]<ff[vv][0]+ww) 27 ff[u][0]=ff[vv][0]+ww; 28 } 29 } 30 } 31 32 void dfs2(int u,int f) 33 { 34 vis[u]=true; 35 int max1,max2,v1,v2; 36 max1=max2=0; 37 for(int i=0;i<no[u].size();i++) 38 { 39 int vv; 40 vv=no[u][i].v; 41 if(vv!=f) 42 { 43 int ww=no[u][i].w; 44 __int64 temp; 45 temp=ff[vv][0]+ww; 46 if(temp>max1) 47 { 48 max2=max1;max1=temp; 49 v2=v1; v1=vv; 50 } 51 else if(temp==max1||temp>max2) 52 { 53 max2=temp; v2=vv; 54 } 55 } 56 } 57 if(u!=1) 58 { 59 __int64 temp; 60 temp=ff[u][1]; //第一层的ff[u][1]=0 之后的 在上一层已经算出来了 61 int vv=-1; 62 if(temp>max1) 63 { 64 max2=max1; v2=v1; 65 max1=temp; v1=vv; 66 } 67 else if(temp==max1||temp>max2) 68 { 69 max2=temp; v2=vv; 70 } 71 } 72 for(int i=0;i<no[u].size();i++) 73 { 74 int vv,ww; 75 vv=no[u][i].v; ww=no[u][i].w; 76 if(vis[vv]) 77 continue; 78 if(vv!=f) 79 { 80 if(vv==v1) 81 ff[vv][1]=max2+ww; 82 else ff[vv][1]=max1+ww; 83 } 84 dfs2(vv,u); //算u的 这一层时已经把 ff[v][1]算出来了 也就是下一层的f[u][1] 85 } 86 } 87 88 int main() 89 { 90 int i,j,n,a,b; 91 while(scanf("%d",&n)!=EOF) 92 { 93 for(int i=1;i<=n;i++) 94 no[i].clear(); 95 for(int i=2;i<=n;i++) 96 { 97 scanf("%d%d",&a,&b); 98 node t; 99 t.v=a; t.w=b; 100 no[i].push_back(t); 101 t.v=i; t.w=b; 102 no[a].push_back(t); 103 } 104 memset(ff,0,sizeof(ff)); 105 memset(vis,false,sizeof(vis)); 106 dfs1(1,-1); 107 memset(vis,false,sizeof(vis)); 108 dfs2(1,-1); 109 for(int i=1;i<=n;i++) 110 { 111 __int64 temp; 112 temp=max(ff[i][0],ff[i][1]); 113 printf("%I64d ",temp); 114 } 115 116 } 117 return 0; 118 }