hdu 2196 树形dp

【题意】:给出一棵树, 每条边有一个权值 求离每个节点最远的点的权值和

 

看这篇题解学会的  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\n",temp);
114         }
115 
116    }
117    return 0;
118 }

 

posted @ 2014-03-05 18:03  galaxy77  阅读(125)  评论(0编辑  收藏  举报