hdu5834
题目让求得是从任意一点出发可以不回来得到的最大的价值
这应该不算特别水的树形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的更多相关文章
- 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree
// 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree // 题意:n个点的树,每个节点有权值为正,只能用一次,每条边有负权,可以 ...
- hdu5834 Magic boy Bi Luo with his excited tree 【树形dp】
题目链接 hdu5834 题解 思路很粗犷,实现很难受 设\(f[i][0|1]\)表示向子树走回来或不回来的最大收益 设\(g[i][0|1]\)表示向父亲走走回来或不回来的最大收益 再设\(h[i ...
- 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 ...
- 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: ...
- HDU5834 Magic boy Bi Luo with his excited tree (树形DP)
题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...
随机推荐
- Bash Shell 获取进程 PID
转载地址:http://weyo.me/pages/techs/linux-get-pid/ 导读 Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运 ...
- docker容器分配静态IP
最近因为工作要求需要用学习使用docker,最后卡在了网络配置这一块.默认情况下启动容器的时候,docker容器使用的是bridge策略比如: docker run -ti ubuntu:latest ...
- Oracle 游标示例,带异常处理
Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ F ...
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
- iOS设计模式笔记
设计模式 所谓设计模式,就是经过无数程序员的努力,在很多代码的基础上抽取出来的"模式" 一种设计模式,通常用来解决一种问题 MVC体系架构 也是一个设计模式,主要解决:界面(V), ...
- 【转载】快速收索并更新sid 方法
利用Google的搜索功能,可以获得不少SAS各个版本的SID号,试过之后你会异常惊喜.1.打开谷歌: http://google.com.hk2.输入或复制这个段文字:"SID_heade ...
- 2.1 ARM家族大检阅
芯片名称 ARM核 指令架构 S3C2440 ARM9 ARMv4T S3C6410 ARM11 ARMv6 S5PV210 Cortex A8 ARMv7-A Cortex M工控 Cortex R ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- java面向对象基础
1.对象:用来描述客观事物的一个实体,由一组属性和方法构成. 属性:对象具有的各种特征.(成员变量) 方法:对象执行的操作. 2.类:一组具有相同属性和方法的对象的一个归纳类型.对象是类的一个具体表现 ...
- CSS常用样式及示例
CSS常用样式及示例 一.简介 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集) ...