zoukankan      html  css  js  c++  java
  • 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
    ",temp);
    114         }
    115 
    116    }
    117    return 0;
    118 }
  • 相关阅读:
    pandas常用操作
    python读取文件并写入内容到文件
    《软件工程》学习进度博客13
    01梦断代码读后感1—上帝游戏
    软件工程学习进度博客12
    《软件工程》个人作业5----单词统计
    用户模板和用户场景
    软件工程学习进度博客11
    PHP学习3:简单的流程控制
    《软件工程》个人作业6---找水王
  • 原文地址:https://www.cnblogs.com/assult/p/3583011.html
Copyright © 2011-2022 走看看