hdu 2196(树的最长链)
题意:输出从一颗树中所有结点出发可以走的最长的路。
思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <math.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #define MP(a, b) make_pair(a, b) 14 #define PB(a) push_back(a) 15 using namespace std; 16 17 const int LEN = 10010; 18 const int INF = 0x3f3f3f3f; 19 typedef pair<int, int> pii; 20 vector<pii> Map[LEN]; 21 int n, vis[LEN], dis[LEN], disa[LEN]; 22 23 24 int bfs(int v){ 25 queue<int> q; 26 memset(vis, 0, sizeof vis); 27 memset(dis, 0, sizeof dis); 28 q.push(v); 29 vis[v] = 1; 30 while(!q.empty()){ 31 int nv = q.front(); q.pop(); 32 for(int i=0; i<Map[nv].size(); i++){ 33 int x = Map[nv][i].first; 34 if(!vis[x]){ 35 vis[x] = 1; 36 dis[x] = dis[nv] + Map[nv][i].second; 37 q.push(x); 38 } 39 } 40 } 41 int maxv = -INF, maxn; 42 for(int i=0; i<n; i++){ 43 if(maxv < dis[i]){ 44 maxv = dis[i]; 45 maxn = i; 46 } 47 } 48 return maxn; 49 } 50 51 int main() 52 { 53 // freopen("in.txt","r",stdin); 54 // freopen("out.txt","w",stdout); 55 56 int a, b; 57 while(scanf("%d", &n)!=EOF){ 58 for(int i=0; i<LEN; i++) Map[i].clear(); 59 for(int i=1; i<n; i++){ 60 scanf("%d%d", &a, &b); 61 a--; 62 Map[i].PB(MP(a, b)); 63 Map[a].PB(MP(i, b)); 64 } 65 int vexa = bfs(0); 66 int vexb = bfs(vexa); 67 for(int i=0; i<n; i++)disa[i] = dis[i]; 68 bfs(vexb); 69 for(int i=0; i<n; i++){ 70 printf("%d\n", max(disa[i], dis[i])); 71 } 72 } 73 return 0; 74 }
View Code
转载于:https://www.cnblogs.com/shu-xiaohao/p/3703558.html
hdu 2196(树的最长链)相关推荐
- P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)
P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb<deepa:c 在点 a 的子树中,根据乘法原理计算 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- $Loj10155$ 数字转换(求树的最长链) 树形$DP$
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...
- HDU4607(求树中的最长链)
题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...
- 1577 例题3 数字转换(LOJ10155) 约数计算 树上最长链(两次找最大深度)
总目录 在线测评地址(ybt) 在线测评地址(LOJ) 发现竟然读不懂题.努力静下来,再读题,总算有了眉目. 4→3→1→74的约数,不包括本身,1,2,约数和是1+2=3, 3的约数,不包括本身,1 ...
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...
- YBTOJ:最短时间(长链剖分、线段树)
解析 不难得到最优策略:先尽可能的快的送死直到路径畅通无组,然后一口气冲到t点. 现在的难点就在于如何尽可能的快的送掉特定的次数. 不难发现,花费时间关于死亡次数的函数必然是一个下凸包. 设 fx,i ...
- UOJ#284-快乐游戏鸡【长链剖分,线段树】
正题 题目链接:https://uoj.ac/problem/284 题目大意 nnn个点的一棵树,每个点有一个wiw_iwi表示至少死亡wiw_iwi次才能通过这个点,否则就会死亡.只能往子节点 ...
- 树链剖分之长链剖分 详解 题目整理
树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...
最新文章
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
- Apache ZooKeeper - FourLetterCommands运维命令
- linux结束ping进程,linux常用命令
- ssl初一组周六模拟赛【2018.5.19】
- 在python中可以使用urllib方便的实现图片和flash下载
- linux mq脚本,Linux自动化命令工具expect
- Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系
- 怎么把python从c盘移到d盘_如何转移Pycharm的设置或者缓存到其他盘
- 本博客自排名1000到400的各项数据变化
- 多台欧姆龙PLC通过智能网关实现HTTP协议对接MES系统
- IOS版本APP STORE上架流程
- 针式打印机打印显示传真服务器,针式打印机三联纸怎么设置 点击上面的工具栏上的打印服务...
- 苹果企业开发者账号申请攻略
- 语义分割标注工具Semantic Segmentation Editor 快速安装指南
- jQuery图片特效脚本prettyPhoto简介
- Log4j for C++ 实用指南
- 尽早取出住房公积金是明智选择
- Linux平台总线驱动设备模型
- 前端学习:jQuery学习--Day03
- WinRAR 3.93 3.92 的注册码(已经测试)
热门文章
- 微服务技术方案:Spring Cloud 从入门到实战
- Flask 实战:如何从零开发“知乎”
- 18个堪称神器的命令行工具,高效运维必备
- worknc的后处理如何安装_UG NX后处理安装方法(新手入门)
- php linux权限,Linux权限详细介绍
- lisp语言画阿基米德线_孩子总说“我不会画”!那么孩子是否要先学画形象?...
- 高一计算机组装,高中生计算机组装与维护,呼市新华互联网学校
- 计算机术语中英文cat表示,pcb 专业术语 中英文对照三
- Java领域的对象如何传输-如何解决报错的问题呢?
- 织入业务代码-ModifyService