题目链接:大臣的旅费

思路:锦囊说用广搜,可惜这题没说数据范围,担心复杂度太高,我就直接用的树形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代码:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <utility>
  6. #include <string>
  7. #include <iostream>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14. #define eps 1e-10
  15. #define inf 0x3f3f3f3f
  16. #define PI pair<int, int>
  17. const int maxn = 1e4 + 5;
  18.  
  19. vector<PI>son[maxn];
  20. int d[maxn];
  21. bool cmp(int a, int b) {
  22. return a > b;
  23. }
  24.  
  25. int dfs(int u, int pre) {
  26. int n = son[u].size();
  27. d[u] = 0;
  28. int ans = 0;
  29. vector<int>road;
  30. if(!n) return 0;
  31. for(int i = 0; i < n; ++i) {
  32. int v = son[u][i].first, cost = son[u][i].second;
  33. if(v == pre) continue;
  34. int h = dfs(v, u);
  35. ans =max(ans, h + cost);
  36. road.push_back(h + cost);
  37. }
  38. sort(road.begin(), road.end(), cmp);
  39. if(road.size() == 1) d[u] = road[0];
  40. else if(road.size() > 1)d[u] = road[0] + road[1];
  41. return ans;
  42. }
  43.  
  44. int main() {
  45. int n;
  46. while(scanf("%d", &n) == 1) {
  47. memset(d, 0, sizeof(d));
  48. for(int i = 0; i < n; ++i) son[i].clear();
  49. int x, y, cost;
  50. for(int i = 1; i < n; ++i) {
  51. scanf("%d%d%d", &x, &y, &cost);
  52. son[x-1].push_back(make_pair(y-1, cost));
  53. son[y-1].push_back(make_pair(x-1, cost));
  54. }
  55. dfs(0, -1);
  56. int ans = 0;
  57. for(int i = 0; i < n; ++i) {
  58. ans = max(ans, d[i]);
  59. }
  60. printf("%d\n", (ans + 1)*ans/2 + ans * 10);
  61. }
  62. return 0;
  63. }

如有不当之处欢迎指出!

历届试题 大臣的旅费 树形DP的更多相关文章

  1. 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]

    题解: 求树的直径. 转一篇博客:http://www.cnblogs.com/hanyulcf/archive/2010/10/23/tree_radius.html 树的直径是指树的最长简单路.求 ...

  2. 蓝桥杯--- 历届试题 大臣的旅费 (DFS & Vector)

    题目提交链接:http://lx.lanqiao.org/problem.page?gpid=T32 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国 ...

  3. 历届试题 大臣的旅费-(树的直径+dfs)

    问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  4. 算法笔记_191:历届试题 大臣的旅费(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考, ...

  5. Java实现 蓝桥杯 历届试题 大臣的旅费

    问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  6. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  7. 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

    接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...

  8. 转 蓝桥杯 历届试题 波动数列 [ dp ]

    传送门   历届试题 波动数列   时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个 ...

  9. 算法笔记_176:历届试题 最大子阵(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入 ...

随机推荐

  1. iOS学习——获取当前最顶层的ViewController

    在iOS开发过程中,我们经常性会需要获取当前页面的ViewController,然后利用ViewController进行一些操作,例如在最顶层的ViewController上展示一个UIAlertCo ...

  2. TDD最佳实践

    这里就先目前阶段,整理一份TDD的最佳实践,在之后的Xunit测试整理中,这份实践会越来越长,对于这份核心在写测试的时候应该时刻注意. 1,在软件开发领域中,从来没有这样的事情:少数的几行代码对大量的 ...

  3. jdbc参数

    JDBC连接池参数:    jdbc.initialSize=0       //初始化连接    jdbc.maxActive=30     //连接池的最大数据库连接数,设为0表示无限制    j ...

  4. nodejs cluster模块初探

    大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,为了使用多核cpu来提高性能 就有了cluster,让node可以利用多核CPU实现并行 ...

  5. 基于JAVA实现的排序算法总结

    常用的排序方法有:冒泡排序.快速排序.选择排序.插入排序.归并排序,除此之外,还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.希尔排序等,这里着重介绍下前半段列举的几种常见方法的实现. 1. 冒泡排序法: ...

  6. xDB and sitecore 8 hardware Recommendations

    xDB and sitecore 8 hardware Recommendations as below: xDB hardware guidelines https://doc.sitecore.n ...

  7. HTML中的表单

    1.HTML中表单元素的基本概念 HTML表单是HTML元素中较为复杂的部分,表单往往和脚本,动态页面,数据处理等功能相结合,因此是制作动态网站很重要的内容. 表单一般用来收集用户的输入信息 2.表单 ...

  8. Sonar 常用代码规则整理(二)

    摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ============ ...

  9. 弥补wxpython无背景图片缺陷

    思路: 通过设置Panel的背景样式为wx.BG_STYLE_CUSTOM: self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 绑定Panel的背景事情: sel ...

  10. 洛谷 [P4011] 孤岛营救问题

    状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio& ...