历届试题 大臣的旅费 树形DP
题目链接:大臣的旅费
思路:锦囊说用广搜,可惜这题没说数据范围,担心复杂度太高,我就直接用的树形DP--求树的最远路径。
以城市1为整棵树的根结点,d(i)表示以i为根结点的子树的最远路径,还有一个f(i)表示以i为根结点,从根节点i出发的最远距离,状态转移方程d(i) = max1 + max2,或则d(i) = max,即选取最长的两条子树的最远路径相加,或只有一个子节点就是加上最大值。f(i) = max(len(i, j) + f(j));
AC代码:
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- #include <utility>
- #include <string>
- #include <iostream>
- #include <map>
- #include <set>
- #include <vector>
- #include <queue>
- #include <stack>
- using namespace std;
- #define eps 1e-10
- #define inf 0x3f3f3f3f
- #define PI pair<int, int>
- const int maxn = 1e4 + 5;
- vector<PI>son[maxn];
- int d[maxn];
- bool cmp(int a, int b) {
- return a > b;
- }
- int dfs(int u, int pre) {
- int n = son[u].size();
- d[u] = 0;
- int ans = 0;
- vector<int>road;
- if(!n) return 0;
- for(int i = 0; i < n; ++i) {
- int v = son[u][i].first, cost = son[u][i].second;
- if(v == pre) continue;
- int h = dfs(v, u);
- ans =max(ans, h + cost);
- road.push_back(h + cost);
- }
- sort(road.begin(), road.end(), cmp);
- if(road.size() == 1) d[u] = road[0];
- else if(road.size() > 1)d[u] = road[0] + road[1];
- return ans;
- }
- int main() {
- int n;
- while(scanf("%d", &n) == 1) {
- memset(d, 0, sizeof(d));
- for(int i = 0; i < n; ++i) son[i].clear();
- int x, y, cost;
- for(int i = 1; i < n; ++i) {
- scanf("%d%d%d", &x, &y, &cost);
- son[x-1].push_back(make_pair(y-1, cost));
- son[y-1].push_back(make_pair(x-1, cost));
- }
- dfs(0, -1);
- int ans = 0;
- for(int i = 0; i < n; ++i) {
- ans = max(ans, d[i]);
- }
- printf("%d\n", (ans + 1)*ans/2 + ans * 10);
- }
- return 0;
- }
如有不当之处欢迎指出!
历届试题 大臣的旅费 树形DP的更多相关文章
- 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]
题解: 求树的直径. 转一篇博客:http://www.cnblogs.com/hanyulcf/archive/2010/10/23/tree_radius.html 树的直径是指树的最长简单路.求 ...
- 蓝桥杯--- 历届试题 大臣的旅费 (DFS & Vector)
题目提交链接:http://lx.lanqiao.org/problem.page?gpid=T32 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国 ...
- 历届试题 大臣的旅费-(树的直径+dfs)
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- 算法笔记_191:历届试题 大臣的旅费(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考, ...
- Java实现 蓝桥杯 历届试题 大臣的旅费
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...
- 转 蓝桥杯 历届试题 波动数列 [ dp ]
传送门 历届试题 波动数列 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个 ...
- 算法笔记_176:历届试题 最大子阵(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入 ...
随机推荐
- iOS学习——获取当前最顶层的ViewController
在iOS开发过程中,我们经常性会需要获取当前页面的ViewController,然后利用ViewController进行一些操作,例如在最顶层的ViewController上展示一个UIAlertCo ...
- TDD最佳实践
这里就先目前阶段,整理一份TDD的最佳实践,在之后的Xunit测试整理中,这份实践会越来越长,对于这份核心在写测试的时候应该时刻注意. 1,在软件开发领域中,从来没有这样的事情:少数的几行代码对大量的 ...
- jdbc参数
JDBC连接池参数: jdbc.initialSize=0 //初始化连接 jdbc.maxActive=30 //连接池的最大数据库连接数,设为0表示无限制 j ...
- nodejs cluster模块初探
大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,为了使用多核cpu来提高性能 就有了cluster,让node可以利用多核CPU实现并行 ...
- 基于JAVA实现的排序算法总结
常用的排序方法有:冒泡排序.快速排序.选择排序.插入排序.归并排序,除此之外,还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.希尔排序等,这里着重介绍下前半段列举的几种常见方法的实现. 1. 冒泡排序法: ...
- xDB and sitecore 8 hardware Recommendations
xDB and sitecore 8 hardware Recommendations as below: xDB hardware guidelines https://doc.sitecore.n ...
- HTML中的表单
1.HTML中表单元素的基本概念 HTML表单是HTML元素中较为复杂的部分,表单往往和脚本,动态页面,数据处理等功能相结合,因此是制作动态网站很重要的内容. 表单一般用来收集用户的输入信息 2.表单 ...
- Sonar 常用代码规则整理(二)
摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ============ ...
- 弥补wxpython无背景图片缺陷
思路: 通过设置Panel的背景样式为wx.BG_STYLE_CUSTOM: self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 绑定Panel的背景事情: sel ...
- 洛谷 [P4011] 孤岛营救问题
状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio& ...