题目让求得是从任意一点出发可以不回来得到的最大的价值

这应该不算特别水的树形dp了,它不止要从上往下dfs,后来海要重新dfs,根据父亲节点更新儿子节点,算是正常的树形dp中比较简单的吧。

思路:

  先从上往下dp,求出从该节点往下来在回到该节点的最大价值,不用回到该节点的最大价值以及此时停在哪一颗子树上,不用回到该节点且不停在前面的子树上的最大价值(只是不用回到该节点,不是一定不能回到该节点)

然后重新dfs,计算出儿子节点往上能回来的最大价值以及不用回来的最大价值,显然结果就是max(往下再回来的最大价值+往上不用回来的最大价值,往下不用回来的最大价值+往上再回来的最大价值)。

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int val[];
int ans[];
int val1[];//回到自身
int val2[];//没有回到自身
int val3[];//次优
int id[];//最后从哪个枝上面走了之后没有回到自身
vector<pair<int,int> >v[];
void dfs1(int s,int fa)
{
val1[s]=val2[s]=val3[s]=val[s];
for(int i=;i<v[s].size();i++)
{
int t=v[s][i].first;
int c=v[s][i].second;
if(t==fa)
continue;
dfs1(t,s);
int temp=max(val1[t]-*c,);
val2[s]+=temp;
val3[s]+=temp;
if(val1[s]+val2[t]-c>val2[s])
{
val3[s]=val2[s];
val2[s]=val1[s]+val2[t]-c;
id[s]=t;
}
else if(val1[s]+val2[t]-c>val3[s])
val3[s]=val1[s]+val2[t]-c;
val1[s]+=temp;
}
}
void dfs2(int s,int fa,int temp3,int temp4)
{//temp3表示向上走还要回来能得到的优势,temp4对应的是不回来的
ans[s]=max(val1[s]+temp4,val2[s]+temp3);
val2[s]+=temp3;
val3[s]+=temp3;
if(val2[s]<=val1[s]+temp4)//更新向上走了之后对应的结果
{
val2[s]=val1[s]+temp4;//这地方不更新val3[s]是因为一定用不到val3[s]了
id[s]=fa;
}
else if(val3[s]<=val1[s]+temp4)
val3[s]=val1[s]+temp4;
val1[s]+=temp3;
for(int i=;i<v[s].size();i++)
{
int t=v[s][i].first;
int c=v[s][i].second;
if(t==fa)
continue;
int temp1=max(,val1[s]-*c-max(,val1[t]-*c));
int temp2;
if(id[s]==t)
temp2=max(,val3[s]-c-max(,val1[t]-*c));
else temp2=max(,val2[s]-c-max(,val1[t]-*c));
dfs2(t,s,temp1,temp2);
}
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&val[i]);
v[i].clear();
}
int a,b,c;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
memset(id,-,sizeof(id));
dfs1(,-);
dfs2(,-,,);
printf("Case #%d:\n",cas);
for(int i=;i<=n;i++)
printf("%d\n",ans[i]);
}
return ;
}

hdu5834的更多相关文章

  1. 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree

    // 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree // 题意:n个点的树,每个节点有权值为正,只能用一次,每条边有负权,可以 ...

  2. hdu5834 Magic boy Bi Luo with his excited tree 【树形dp】

    题目链接 hdu5834 题解 思路很粗犷,实现很难受 设\(f[i][0|1]\)表示向子树走回来或不回来的最大收益 设\(g[i][0|1]\)表示向父亲走走回来或不回来的最大收益 再设\(h[i ...

  3. HDU5834 Magic boy Bi Luo with his excited tree(树形DP)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5834 Description Bi Luo is a magic boy, he also ...

  4. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  5. HDU5834 Magic boy Bi Luo with his excited tree (树形DP)

    题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...

随机推荐

  1. 为不同版本的 Windows 编写驱动程序

    MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554887(v=vs.85).aspx 创建驱动程序项目时,指定 ...

  2. lsyncd 实时同步

    1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的 ...

  3. Nhibernate对应关系参数介绍

    一.多对一关联映配置介绍 <many-to-one name="PropertyName" 属性名 column="column_name" 数据库字段名 ...

  4. 管道过滤器模式(Pipe and Filter)与组合模式(修改)

    转自:http://haolloyin.blog.51cto.com/1177454/348277 之前在 benjielin 前辈的博客中看到“管道过滤器(Pipe-And-Filter)模式(ht ...

  5. Tomcat7启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLDs.就停止不动了

    环境: RHEL7,tomcat7.0.70 问题: 启动tomcat时,catalina.out日志打印到如下内容就停止不动了,也不报错 SEVERE: FarmWarDeployer can on ...

  6. (整理)C#基础知识_泛型的实现

    本文是截取自MSDN的文章部分,方便自己查看,原文地址:https://msdn.microsoft.com/zh-cn/library/ms379564(VS.80).aspx 泛型实现 表面上,C ...

  7. 在MyBook Live上部署svn

    一直以来都在用svn管理源代码,美中不足的是由于svn服务器端部署在本地,无法实现在异地迁入迁出程序,因此考虑将svn服务器部署在我的MyBook Live上. 一.部署svn 1.分别执行以下2条命 ...

  8. 剑指Offer:面试题34——丑数(java实现)

    问题描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路1: ...

  9. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  10. bash profile .bashrc

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...