hdu 2196

题意

给出一棵树,求出树上每一个点在树上走一条简单路径所能走的最长距离。

解法

说起来,这是我今天1A的第一题
我们设
\(up[i]\) 表示从这个点向上走到某个点又向下走的最长距离
设 \(down[i][0]\) 表示从这个点出发向他的子树所能走到的最大距离,
\(down[i][1]\) 表示从这个点出发向他的子树所能走到的次大距离,
然后我们就可以愉快的开始转移了。
我们先dfs一边求出 \(down[i][0/1]\) ,然后我们再dfs一边求 \(up[i]\) 。
首先 \(up[i] = up[fa] + dis[i][fa]\)
如果 i 在 fa 向下走的最深路径上,那么: \(up[i] = max(up[i],dis[i][fa]+down[fa][1])\)
否则: \(up[i] = max(up[i],dis[i][fa]+down[fa][0])\)
最后每个点的答案为 \(max(up[i],down[i][0])\) 。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <vector>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{x=0;T k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=10000+5;
int up[maxn];
int down[maxn][2];
int n;
struct Edge{int u,v,w;Edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
};
vector<Edge> edge;
vector<int> G[maxn];
void add_edge(int u,int v,int w) {edge.push_back(Edge(u,v,w));edge.push_back(Edge(v,u,w));int m=edge.size();G[u].push_back(m-2);G[v].push_back(m-1);
}void dfs1(int u,int fa) {for(int i=0;i<G[u].size();i++) {Edge e=edge[G[u][i]];int v=e.v;if(v==fa) continue;dfs1(v,u);if(down[v][0]+e.w>=down[u][0]){down[u][1]=down[u][0];down[u][0]=down[v][0]+e.w;}else if(down[v][0]+e.w>=down[u][1]) down[u][1]=down[v][0]+e.w;}
}
void dfs2(int u,int fa) {for(int i=0;i<G[u].size();i++) {Edge e=edge[G[u][i]];int v=e.v;if(v==fa) continue;if(down[u][0]!=down[v][0]+e.w)up[v]=e.w+down[u][0];else up[v]=e.w+down[u][1];up[v]=max(up[u]+e.w,up[v]);dfs2(v,u);}
}
void _init() {edge.clear();for(int i=1;i<=n;i++) G[i].clear();del(down,0);del(up,0);
}
int main()
{while(~scanf("%d",&n)){_init();for(int u=2,v,w;u<=n;u++) {read(v);read(w);add_edge(u,v,w);}dfs1(1,1);dfs2(1,1);for(int i=1;i<=n;i++) printf("%d\n",max(up[i],down[i][0]));}return 0;
}

转载于:https://www.cnblogs.com/mrasd/p/9550879.html

hdu 2196 computer相关推荐

  1. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  2. Hdu 2196 - Computer

    即求树上每点的最长路,先求出树的直径上的一点(dfs.bfs均可,寻找第一点我用的bfs),然后再从这点搜出树直径的另一点.可以证明每点的最长路是到这两点的距离之一(因为树是连通的,因为是树的直径,如 ...

  3. HDU - 2196 Computer(树形dp)

    题目链接:点击查看 题目大意:给定n个点以及n-1条边,保证可以组成一棵树,问每个点所能到达的最远距离 题目分析:首先这是一颗无向图所组成的树,经过分析,我们可以得到任何一个点,对于它所能到达的最远距 ...

  4. 【树形DP】 HDU 2196 Computer

    题意:求节点间的最大距离 先DFS一次 记录下 每一节点的子树下的最大距离(DP[ u ] [ 0 ])和第二大距离(DP[ u ] [ 1 ]) 用DP[ v ] [ 2 ] 表示由v的父节点来的最 ...

  5. HDU 2196 求树上所有点能到达的最远距离

    其实我不是想做这道题的...只是今天考试考了一道类似的题...然后我挂了... 但是乱搞一下还是有80分....可惜没想到正解啊! 所以今天的考试题是: 巡访 (path.pas/c/cpp) Cha ...

  6. HDU - 2196(树形DP)

    题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...

  7. hdu 2196(经典树形dp)

    题意:给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 解题思路:这道题网上说是经典的树形dp,不过确实很巧妙.两次dfs应该是比较好想到的,因为某节点最大的距离要么就是一直走到叶子节点, ...

  8. hdu 2196(树的最长链)

    题意:输出从一颗树中所有结点出发可以走的最长的路. 思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案. 代码如下: 1 #include <stdio.h> 2 #inc ...

  9. hdu 2196 叶子节点最长距离(树DP)

    http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html 求每个节点到叶子节点的最长距离 需要保存每个节点到叶子节点距离的最大值和 ...

最新文章

  1. 前途到底是网络工程还是程序设计
  2. 在R中子集化数据框的5种方法
  3. 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法
  4. 记录Flex布局的属性
  5. 在ubuntu16.04中一键创建LAMP环境 新系统
  6. leetcode 64. Minimum Path Sum
  7. bootstrap样式
  8. 音频断句Matlab,一步一步教你实现iOS音频频谱动画(二)
  9. Routeros2.9.7安装总结
  10. juniper srx电话单通
  11. nearly,about,almost的区别
  12. pg加密扩展的安装_PHP7安装已废弃的对称加密扩展mcrypt记录
  13. 凸优化-Proximal GD
  14. Axure 注册码(亲测可用)
  15. matlab巴特沃斯滤波器算法解释,巴特沃斯滤波器原理.doc
  16. 小程序中插入腾讯视频
  17. windows无法格式化u盘怎么办_U盘提示格式化怎么办 U盘提示格式化解决方法【详解】...
  18. C_CAPM模型(上)
  19. PS长投影文字制作教程
  20. Xcode9 通过无线链接调试,亲测成功

热门文章

  1. Linux 设备驱动开发思想 —— 驱动分层与驱动分离
  2. MyBatis Generator配置文件翻译
  3. 修改系统默认路径,如收藏夹、桌面、我的文档
  4. 飞凌开发板 cramfs 镜像文件修改
  5. Taro+react开发(63) 修改蓝湖的样式
  6. React开发(162):React关于 this.props.children 总结
  7. 前端学习(3121):react-hello-react的state的简写方式
  8. [vue-cli]vue-cli3插件有写过吗?怎么写一个代码生成插件?
  9. 前端学习(2589):前端权限的设计思路
  10. 前端学习(2382):js编码规范说明