一开始总觉得是dfs序之类的问题,子树中的数量很好解决,一直在思考如何往上求数量。很久后才注意到边带权,然后只好放弃dfs序,只能考虑树形DP了。然后就是经典的求树的直径的改造。然后写搓了(大概就是第一遍dfs的时候维护的量不够多,所以在第二次dfs时就得用更多的运算量去弥补,即没有用更多的空间去换时间,所以超时了,以前这么写都能过啊,这次就不行了,更重要的是自己写得很不熟练,很多细节都搞错了,WA了好几发)。

以后自己一定要多看几遍题目,想一会,看一会,这样可以保证自己对题目有深刻的印象,防止自己理解有偏差或者想着想着就忘记了题目的限制条件。最后经典题目一定要做熟练,否则到了战场上还要再复习,还要一点一点磨,像什么样。

解题思路,就是经典树形DP——求树的直径的略加改编。

第一遍dfs求所有节点所在子树的(最大深度,对应的点的个数)和(次大深度,对应的点的个数)。

然后第二遍dfs求所有节点往上走的(最大长度,对应的点的个数)。

输出时循环+讨论一下即可。

搓代码

#include<bits/stdc++.h>
#define maxn 100010
using namespace std;int N;
vector<int>G[maxn];
vector<int>W[maxn];
int d1[maxn],cd1[maxn],d2[maxn],cd2[maxn],df[maxn];
int up[maxn],cup[maxn];
int d[maxn],cd[maxn];void dfs1(int u,int f)
{d1[u]=d2[u]=cd1[u]=cd2[u]=-1;for(unsigned int i=0;i<G[u].size();i++){int v=G[u][i];if(v==f){df[u]=W[u][i];continue;}dfs1(v,u);int D=W[u][i]+d1[v];if(D>d1[u]){d2[u]=d1[u];cd2[u]=cd1[u];d1[u]=D;cd1[u]=cd1[v];}else if(D==d1[u]) cd1[u]+=cd1[v];else if(D>d2[u]){d2[u]=D;cd2[u]=cd1[v];}else if(D==d2[u]) cd2[u]+=cd1[v];}if(d1[u]==-1){d1[u]=0;cd1[u]=1;}
}void dfs2(int u,int f)
{up[u]=up[f]+df[u];cup[u]=cup[f];if(!(d1[u]+df[u]==d1[f]&&cd1[f]==cd1[u])){int D=d1[f]+df[u];if(D>up[u]){up[u]=D;cup[u]=cd1[f];if(d1[u]+df[u]==d1[f]) cup[u]-=cd1[u];}else if(D==up[u]){cup[u]+=cd1[f];if(d1[u]+df[u]==d1[f]) cup[u]-=cd1[u];}}else if(cd2[f]!=-1){if(d1[f]==d1[u]+df[u]){int D=d2[f]+df[u];if(D>up[u]){up[u]=D;cup[u]=cd2[f];}else if(D==up[u]) cup[u]+=cd2[f];}else{int D=d1[f]+df[u];if(D>up[u]){up[u]=D;cup[u]=cd1[f];if(d1[u]+df[u]==d1[f]) cup[u]-=cd1[u];}else if(D==up[u]){cup[u]+=cd1[f];if(d1[u]+df[u]==d1[f]) cup[u]-=cd1[u];}}}if(d1[u]==up[u]){d[u]=d1[u];cd[u]=cd1[u]+cup[u];}else if(d1[u]>up[u]){d[u]=d1[u];cd[u]=cd1[u];}else{d[u]=up[u];cd[u]=cup[u];}for(unsigned int i=0;i<G[u].size();i++){int v=G[u][i];if(v==f) continue;dfs2(v,u);}
}int kase;int main()
{up[0]=0;cup[0]=1;G[0].push_back(1);W[0].push_back(0);while(~scanf("%d",&N)){for(int i=1;i<=N;i++){G[i].clear();W[i].clear();}int u,v,w;for(int i=1;i<N;i++){scanf("%d %d %d",&u,&v,&w);G[u].push_back(v);W[u].push_back(w);G[v].push_back(u);W[v].push_back(w);}dfs1(1,0);dfs2(1,0);printf("Case #%d:",++kase);for(int i=1;i<=N;i++)printf(" %d",cd[i]);puts("");}return 0;
}

树形DP(Simple Tree,玲珑杯 Round#8 B lonlife 1080)相关推荐

  1. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  2. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  3. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...

  4. 2021牛客多校4 - Rebuild Tree(树形dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...

  5. leetcode 1339. Maximum Product of Splitted Binary Tree | 1339. 分裂二叉树的最大乘积(树形dp)

    题目 https://leetcode.com/problems/maximum-product-of-splitted-binary-tree/ 题解 树形 dp,思路见草稿 /*** Defini ...

  6. Problem F. Grab The Tree HDU - 6324(树形dp+博弈)

    Little Q and Little T are playing a game on a tree. There are nn vertices on the tree, labeled by 1, ...

  7. Tree Cutting POJ - 2378(树形DP)

    题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2. 分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根 ...

  8. 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: ...

  9. 【POJ - 2378】Tree Cutting(树形dp,树的重心变形)

    题干: After Farmer John realized that Bessie had installed a "tree-shaped" network among his ...

  10. 【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)

    题干: 在星际争霸(StarCraft)中,有3个种族.对于任意一个种族,他们的建筑建造都是有一个顺序的.这个顺序正好是一个树形结构,我们称之为"科技树"(Technology t ...

最新文章

  1. 【分析】2014移动互联网数据报告(终极版必收!)
  2. 重写了GD32VF103的启动脚本和链接脚本
  3. 【Linux部署】Greenplum数据库6.13.0单机版 [CRITICAL]:-Error occurred: non-zero rc: 1(报错详情+问题处理:内存释放)
  4. 中引入文件报错_关于前端开发中的模块化
  5. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
  6. 《白鹿原》金句摘抄(六)
  7. 前端js 实现文件下载
  8. 面试问到springmvc不会怎么办?看这篇就够了,springmvc面试题(共22题,含答案)
  9. rocketmq 几种队列_进阶必看的 RocketMQ ,就这篇了
  10. S3TC IAP15F2K61S2点亮一个发光二极管keil和stc-isp软件操作
  11. selinux详解及配置文件
  12. Flume 1.8.0 开发者指南(中文教程)-个人翻译版
  13. C++ 遍历json文件
  14. H5第三方专业支付接口、安全稳定、费率优惠
  15. 输出素数并统计个数--C语言
  16. 计算机上播放时没声音什么故障,电脑播放视频没有声音是什么原因
  17. 3.5寸TFT液晶屏验证板设计过程——硬件篇
  18. Redis底层数据结构-SDS
  19. c语言什么意思000094,Hello World 背后的真实故事
  20. 想要感受三星S8屏幕的震撼 先过APP适配这道坎

热门文章

  1. Java使用纯真IP库获取IP对应省份和城市
  2. 第三方支付简要原理解释说明
  3. php 视频 源码下载,PHP下载哔哩哔哩视频
  4. 清华大学计算机科学学院刘钊,姚 骏-清华大学生命学院
  5. Unity mesh换装
  6. 涨姿势 之 Sourcetree 显示头像
  7. shibor与沪深300指数的相关性图示
  8. FreeRTOS学习笔记(11)——CPU使用率统计
  9. TBODY标签有什么作用
  10. CSDN 社区内容创作规范