C++[POJ1849]铲雪车问题——树形DP求出树的直径
[POJ1849]铲雪车问题
时间限制: 1 Sec 内存限制: 128 MB
题目描述
大雪覆盖了整座城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通。整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的。清单给出了最少的街道,使得这些街道的积雪清除后任意两个交叉路口之间有且仅有一条通路。
冬季服务部门有2辆铲雪车和2名司机,这2辆铲雪车的出发点相同,都位于某个交叉路口。无论街道上有没有积雪,铲雪车每前进一米都要消耗一升燃料。冬季服务部门要求司机在铲除清单上的所有街道的积雪的前提下,消耗燃料最少,铲完后车可以停在任意交叉路口。
输入
第1行:2个整数N,S。(1 < =N < = 100000,1 < = S < =N),N 为交叉路口总数,S为铲雪车出发的路口序号。路口的编号为1~N。
接下来的N-1行为清单上的街道,每一行包含三个用空格隔开的整数A,B,C,表示一条从交叉路口A到交叉路口B的街道,C为该街道的长度。单位为米,1 < = C < =1000
输出
第1行:一个整数,表示铲掉所有积雪所需的最少燃料。
样例输入
5 2 1 2 1 2 3 2 3 4 2 4 5 1
样例输出
6
此题说到底其实一共有多少辆铲雪车都对结果没有影响(原因请读者看完博客后自行思考)
首先我们来考虑只有一辆铲雪车的情况。
想象一下,一辆铲雪车如果要走完所有的树,有许多边肯定是要走两遍的(不理解的话可以画个图走走)
但还有一些边是只用走一遍的。
如图,红色的边走了两遍,绿色的边只走了一遍:
可以这么走:
也可以这么走:
因为所有的边都必需要走到(包括绿色的边),所以我们不妨用一个变量来表示所有边的权值的和乘2,最后的结果就是这个减去所有绿色的边的权值之和。
因为最终要求的答案是最小的,所以我们要做到的最优策略便是使这些绿色的边的权值之和最大。
不知道你们看到最大的边的权值之和第一反应是什么,但我想到的便是树的直径,刚好满足我们要求的这些绿色边的权值之和。
所以我们的策略便是sum减去树的直径(很简单是吧)
这里注意一下这个树的直径应该是从以节点p(车的起点处)的子树中的直径。
如果不知道怎么求树的直径,可以参考一下这篇博客:https://blog.csdn.net/weixin_44049566/article/details/88551163
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;const int N=100010;
#define max(a,b) a>=b?a:bstruct node {int v,w;node() {};node(int V,int W) { v=V;w=W; };
};int n,p,f[N],sum,maxx;
vector <node> G[N];void dfs(int u,int fa) {//求树的直径for(int i=0,v,w;i<G[u].size();i++) {v=G[u][i].v,w=G[u][i].w;if(v==fa) continue;dfs(v,u);maxx=max(maxx,f[u]+f[v]+w);f[u]=max(f[u],f[v]+w);}
}
int main() {cin>>n>>p;for(int i=1,u,v,w;i<n;i++) {cin>>u>>v>>w;sum+=2*w;G[u].push_back( node(v,w) );G[v].push_back( node(u,w) );}dfs(p,0);cout<<sum-maxx;
}
咨询
C++[POJ1849]铲雪车问题——树形DP求出树的直径相关推荐
- 树上子链(树形dp求树的直径)
树上子链 题意: 给定一棵树 T ,树 T 上每个点都有一个权值. 定义一颗树的子链的大小为:这个子链上所有结点的权值和 . 请在树 T 中找出一条最大的子链并输出. 题解: 求树的直径,题目中存在负 ...
- 旅游(树形dp求树的最大独立集)
链接:https://ac.nowcoder.com/acm/problem/15748 来源:牛客网 题目描述 Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游. 旅行地图上有n个城市,它 ...
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
转自:https://www.cnblogs.com/Ash-ly/p/5783877.html 一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合 ...
- 滑稽树下你和我Average distance(树形dp求任意两点距离之和)
滑稽树下你和我. 链接:https://ac.nowcoder.com/acm/contest/992/J 来源:牛客网 题目描述 红红和蓝蓝是随机降生在苹果树上的苹果仙灵,现在红线仙想估测他们的CP ...
- codeforces 1083 A. The Fair Nut and the Best Path(树形dp)
题目大意: 每个节点都给定一个值a[i],从一个节点走到另一个节点会消耗固定值w,但也会得到这个节点的价值,问怎样走才能得到最大的价值. 解题思路: 这个题和树形dp求树的直径差不多(树形DP基本都是 ...
- hdu2196 树形DP
题意: 给你一棵树,求出每一个点到其他点的最大距离. 思路: 每个点的最大距离只有两种情况,1是自己忘下面走的最大,二是网上走的最大,取他们的最大便是答案,每个点网下面的最大可 ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...
- 最大疯子树-树形dp+换根+二次扫描
分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...
最新文章
- zepto打造一款移动端划屏插件
- Envoy Proxy的多面性:边缘网关、服务网格和混合网桥
- Python报错:The truth value of an array with more than one element is ambiguous
- filter函数的用法_动态数组函数系列5| 筛选函数FILTER,单条件多条件动态筛选
- 【皇甫】☀PPT里的小玩意
- Android中如何查看内存(下)
- SpringCloud的Hystrix(二) 某消费者应用(如:ui、网关)访问的多个微服务的断路监控...
- 详细分析莫烦DQN代码
- Oracle索引的建立及优缺点
- 基于Python的图书馆后台管理系统
- 数据结构——拓扑排序算法理解和实现
- Degree and Closeness Centrality
- Win10 默认输入变全角问题解决方法
- 从零开始开发一个大型网站
- SiT5357:±0.1~±0.25ppm超高精度Stratum 3温补振荡器TCXO,60-220MHz
- 洛谷 P5594 【XR-4】模拟赛 记录
- Vue项目中常见问题(55)提交订单、获取订单号、展示支付信息
- 中国余热发电市场运作动态与十四五可行性研究报告2021年版
- 什么是番茄工作法?如何使用番茄工作法?
- 建站宝超级站群版 v1.4
热门文章
- 【神器】yololib 飘云修改版 -- 给iOS APP 添加导入表注入--你懂的
- 2020 — 只争朝夕,不负韶华
- php导航自助收录源码,最近网上流行的导航网秒收录网站php源码
- 【必应】Bing自动提交收录python脚本
- 小故事有大能量(爱情故事)
- 黑暗森林:V神和Paradigm联创都在玩的三体游戏(dark forest)
- 拉普拉斯矩阵与正则化
- 国庆假期,人在囧途,感慨颇多
- 基于单神经元的自适应PID算法实现步骤与MATLAB代码
- vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录