Sample Input
2 3 2 1 2 3 2 5 5 2 1 7 3 1 7 4 2 5 5 2 6
Sample Output
7 63
这类题目就是分类讨论,需要多做做。
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int N=100010;
 6 int cnt,fir[N],nxt[N*2],to[N*2],val[N*2];
 7 void addedge(int a,int b,int v){
 8     nxt[++cnt]=fir[a];
 9     to[fir[a]=cnt]=b;
10     val[cnt]=v;
11 }
12 int Mx[N],dp[N][3],pos[N][2];
13 void Update(int x,int d,int t){
14     if(d>dp[x][0]){dp[x][2]=dp[x][1];dp[x][1]=dp[x][0];pos[x][1]=pos[x][0];pos[x][0]=t;dp[x][0]=d;}
15     else if(d>dp[x][1]){dp[x][2]=dp[x][1];pos[x][1]=t;dp[x][1]=d;}
16     else if(d>dp[x][2])dp[x][2]=d;
17 }
18 void DFS(int x,int fa){
19     for(int i=fir[x];i;i=nxt[i])
20         if(to[i]!=fa){DFS(to[i],x);
21             int d=dp[to[i]][0]+val[i];
22             Mx[x]=max(Mx[x],Mx[to[i]]);
23             Update(x,d,to[i]);
24         }
25     Mx[x]=max(Mx[x],dp[x][0]+dp[x][1]);
26 }
27
28 int down[N],give[N];
29 long long ans;
30 void DP(int x,int fa){
31     Update(x,give[x],0);//往回走的最长链
32     int d1=0,d2=0,p,d;
33     for(int i=fir[x];i;i=nxt[i])
34         if(to[i]!=fa){
35             if(Mx[to[i]]>d1)d2=d1,d1=Mx[to[i]],p=to[i];
36             else if(Mx[to[i]]>d2)d2=Mx[to[i]];
37         }
38     for(int i=fir[x];i;i=nxt[i])
39         if(to[i]!=fa){
40             if(pos[x][0]==to[i])d=dp[x][1]+dp[x][2];
41             else if(pos[x][1]==to[i])d=dp[x][0]+dp[x][2];
42             else d=dp[x][0]+dp[x][1];
43
44             if(to[i]!=p)d=max(d,d1);
45             else d=max(d,d2);
46
47             d=max(down[x],d);ans+=max(Mx[to[i]],d);down[to[i]]=d;
48             if(pos[x][0]!=to[i])give[to[i]]=dp[x][0]+val[i];
49             else give[to[i]]=dp[x][1]+val[i];
50             DP(to[i],x);
51         }
52 }
53
54 void Init(){
55     memset(give,0,sizeof(give));
56     memset(down,0,sizeof(down));
57     memset(fir,0,sizeof(fir));
58     memset(pos,0,sizeof(pos));
59     memset(Mx,0,sizeof(Mx));
60     memset(dp,0,sizeof(dp));
61     ans=cnt=0;
62 }
63 int T,n;
64 int main(){
65     scanf("%d",&T);
66     while(T--){
67         Init();scanf("%d",&n);
68         for(int i=1,a,b,v;i<n;i++){
69             scanf("%d%d%d",&a,&b,&v);
70             addedge(a,b,v);addedge(b,a,v);
71         }
72         DFS(1,1);DP(1,1);
73         printf("%lld\n",ans);
74     }
75     return 0;
76 }

转载于:https://www.cnblogs.com/TenderRun/p/5882970.html

动态规划(树形DP):HDU 5886 Tower Defence相关推荐

  1. hdu 5886 Tower Defence 树形期望dp 雪漫防守战

    题意: 风暴斗篷现在要攻打雪漫城.雪漫城有n(n≤100000)个哨塔防守,哨塔之间有n-1条路相连,(构成一棵树).现在预测到风暴斗篷要进攻某一条路,然后这棵树就一分为二,现在要得到分开后的最长路. ...

  2. 动态规划--树形DP

    动态规划--树形DP  1.什么是树型动态规划  顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既 ...

  3. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  4. 动态规划 —— 树形 DP

    [概述] 树形动态规划是在树的数据结构上的动态规划,在各个阶段呈现树状关系的时候可以采用树形 DP,其基本思想是由子节点的信息推出父节点的信息. 树形 DP 中,是通过以下 4 点树的特点来进行建图的 ...

  5. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  6. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

  7. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  8. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  9. HDU 1520 Anniversary party(树形dp)

    HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...

最新文章

  1. Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法...
  2. 存储设备分区,格式化,挂载
  3. css scale 元素不放大,列元素上的CSS 3动画“transform:scale”对chrome不起作用
  4. C#类型的强制转换及隐式转换
  5. Java比较两个实体属性值是否相同,将不同的属性输出
  6. does not name a type是什么意思_科普:WSGI 是什么,看完保证懂
  7. P2P(Peer to Peer)网络的原理
  8. C++的类型转换操作符
  9. NEON码农指导 Chapter 3 : NEON Instruction Set Architecture
  10. w ndows10用多大c盘,安装win10系统c盘要多大才够用
  11. Flutter之以阿里云图标库为例,使用多色图标
  12. 如何用python计算增长率_如何用excel函数来计算增长率?
  13. 马哥教育SRE笔记【作业】week04
  14. c语言中浮点数取整函数,浮点取整函数
  15. x265-1.7版本-common/quant.cpp注释
  16. 解读 Apache 多个顶级数据库项目的成长经历与开源文化理念
  17. ASR 混合高斯模型GMM的理解
  18. slim的train
  19. jq实现批量下载和打包下载
  20. 小傻蛋的妹妹跟随小甲鱼学习Python的第九节009

热门文章

  1. 我的firefox插件开发历程
  2. PHP中利用Ffmpeg获得flv视频缩略图和播放时间
  3. 一起谈.NET技术,浅析五大ASP.NET数据控件
  4. java垃圾收集方法_java几种垃圾收集方法和垃圾收集器
  5. Unity3D开发的赛车单机小游戏详细介绍(附有游戏下载链接)
  6. 2021-02-28 配置Jetty+GeoServer-2.18.2允许CORS跨域访问 - 草稿
  7. 2019-11-07 检查gcc交叉编译器预定义宏(ARM32/ARM64/X86-64)以及对浮点数的支持情况
  8. GDAL使用DEM数据计算地形指数
  9. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
  10. mysql 临时表 主键_MySQL临时表