前言

此题是道很简单的题(做法不单一,不仅只有树形DP的方法)

做完了这道题才发现此题原来是一道求树的直径的题,也就是求树上两个节点的最大距离。

题目

问题 N(2692): [POJ2631]北极地区的路

时间限制: 1 Sec  内存限制: 128 MB

题目描述

寒冷、人烟稀少的北极地区修建与维护道路时非常昂贵的。因此,修路时只会在任意两个村子之间形成一条唯一的路径,并且中途不会经过其它村子两次。给出一些村子之间的道路信息,使得任意一个村子都能够与任意其它村子连通。

你的任务是找出相距最远的两个村子之间的距离。例如,下图中3与5两个村子相距最远,距离为22。

最多有10,000个村子,村子从1开始,顺序编号。

输入

有若干行,每行3个整数i, j, k,i和j是两个村子的编号,k表示它们之间道路的长度。道路是双向的。

输出

第1行:1个整数,表示相距最远的两个村子的距离。

样例输入

5 1 6
1 4 5
6 3 9
2 6 8
6 1 7

样例输出

22

此题一开始就想到了用树形DP。

思路是用来表示以i为根节点的子树中 ,到离i最远的孙子节点的距离,那么就可以这么实现:

(现在想起来这个状态转移方程似乎太简单了)

唯一的难点是求出两个节点的最大距离。

所以我们可以用ans来保存答案,每次状态进行转移时都要求一个最大值,这便是两个节点距离的最大值,如式:

也就是目前的已转移过的节点i的最大值加上i节点其中一个儿子的f值的和,再加上两者的距离。(请读者自行结合代码理解)

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;const int N=10010;
#define max(a,b) a>=b?a:bstruct node {int v,w;node() {};node(int V,int W) { v=V;w=W; };
};int f[N],ans;
vector <node> G[N];void dfs(int u,int fa) {for(int i=0,v,w;i<G[u].size();i++) {//dfsv=G[u][i].v,w=G[u][i].w;if(v==fa) continue;dfs(v,u);ans=max(ans,f[u]+f[v]+w);//状态转移之前求一个最大值f[u]=max(f[u],f[v]+w);}
}int main() {int i,j,k;while(cin>>i>>j>>k) {//建树G[i].push_back( node(j,k) );G[j].push_back( node(i,k) );}dfs(1,0);cout<<ans;
}

C++剑指offer:[POJ]2631 Roads in the North - 用树形DP的方式求出一棵树的直径相关推荐

  1. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  2. 《剑指offer》第三十一题(栈的压入、弹出序列)

    // 面试题31:栈的压入.弹出序列 // 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是 // 否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4. / ...

  3. 剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

    1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5限制: 0 ...

  4. 【剑指 offer】(二十二)—— 栈的压入、弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可以作为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如 序列1.2.3.4.5 是某栈的压栈序列,序列 4.5.3.2.1 ...

  5. 剑指Offer(第一版)

    除了剑指Offer第一版书中提到的思路,更有剑走偏锋的刁钻解题,欢迎一起变强 热点知识:先中序建立二叉树(6).快速幂(11).回溯&全排列(12).斐波那契数列问题转化为求矩阵的n次方(9) ...

  6. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  7. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  8. 剑指 Offer 65. 不用加减乘除做加法(位运算、递归、迭代)

    一.题目 剑指 Offer 65. 不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*" ...

  9. 字符串全排列算法_C#版_剑指OFFER

    字符串全排列算法_C#版_剑指OFFER 题目描述 ​题目描述 输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组. 例如输入字符串ABC,则输出由字符A, ...

最新文章

  1. C#中获取程序当前路径的集中方法
  2. ajax传递对象数据集,用jquery和json从后台获得数据集的代码
  3. WPF wpf scrollviewer 触屏滚动 窗体弹跳
  4. Orchard源码分析(4):Orchard.Environment.OrchardStarter类
  5. influx生产部署重要配置
  6. JVM004_字节码指令简介
  7. 2018-2019-2 实验四 Android程序设计
  8. spring配置文件最全约束
  9. php根据经纬度获取地理位置
  10. 基于zynq的千兆网udp项目_AC6102开发板千兆以太网UDP传输实验2
  11. GWAS中的genotype imputation简介
  12. **汉服有哪些基本形制呢**
  13. Spider爬虫框架之Spiders模块
  14. 【PHP+微信开发】实现微信对账单处理
  15. 7-1 计算存款利息 (10分) 本题目要求计算存款利息
  16. python计算向量的模_计算Python Numpy向量之间的欧氏距离实例
  17. Linux-搭建web服务器
  18. java读取Excel指定格式的数据
  19. c语言用hash方式数组去重,利用set实现去重
  20. 【ASML】EUV光刻技术PPT

热门文章

  1. JavaScript浏览器对象api整理
  2. 通过mongodump备份单个数据库
  3. 统信UOS安装Intel I219-LM 网卡
  4. pandas数据分析航空公司数据
  5. 使用tx-lcn分布式事务框架无法连接远程TM管理服务
  6. 深入理解计算机系统--fork函数
  7. 基于SSM框架开发生鲜水果蔬菜电商平台系统.rar(含源码及数据库文件)
  8. 关于Windows系统C盘扩容遇到的问题
  9. 中国麦芽酚行业研究与投资战略报告(2022版)
  10. 放着放着假,公司就倒闭了