[hiho 11]树的直径
题目描述
树的直径必然取自某个节点的两个(或一个)最深的子树,可以一遍DFS解决。
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;vector<int> tree[100005];
bool has_parent[100005] = { false };
int max_length[100005];
int ans;void solve(int root_idx) {int lgst = 0, lgst_idx = 0;int size = tree[root_idx].size();for (int i = 0; i < size; i++) { // 递归求树深int sub_idx = tree[root_idx][i];solve(sub_idx);if (lgst < max_length[sub_idx]) {lgst = max_length[sub_idx];lgst_idx = i;}}max_length[root_idx] = lgst + 1;int sec_lgst = 0;for (int i = 0; i < size; i++) { // 次深子树深度int sub_idx = tree[root_idx][i];if (sec_lgst < max_length[sub_idx] && i != lgst_idx) {sec_lgst = max_length[sub_idx];}}ans = max(ans, lgst + sec_lgst);
}int main() {int n;cin >> n;for(int i = 1; i < n; i++) {int a, b;cin >> a >> b;if (has_parent[a]) {tree[a].push_back(b);has_parent[b] = true;} else {tree[b].push_back(a);has_parent[a] = true;}}for (int i = 1; i <= n; i++) {if (!has_parent[i]) {solve(i);break;}}cout << ans << endl;return 0;
}
另一种做法是两遍BFS:以任一个节点为根BFS找到最远的节点,再从该节点BFS找到的最长路径就是直径。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>using namespace std;vector<int> tree[100005];
int length[100005];
int max_length, max_idx;void bfs(int root_idx, int pa_idx, int depth) {length[root_idx] = depth;if (max_length < depth) {max_length = depth;max_idx = root_idx;}int len = tree[root_idx].size();for (int i = 0; i < len; i++) {int sub_idx = tree[root_idx][i];if (sub_idx != pa_idx) {bfs(sub_idx, root_idx, depth + 1);}}
}int main() {int n;cin >> n;for(int i = 1; i < n; i++) {int a, b;cin >> a >> b;tree[a].push_back(b);tree[b].push_back(a);}bfs(1, -1, 0);bfs(max_idx, -1, 0);cout << max_length << endl;return 0;
}
转载于:https://www.cnblogs.com/xblade/p/4478218.html
[hiho 11]树的直径相关推荐
- 树的直径【p3629】[APIO2010]巡逻
Description 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一 ...
- Codeforces 337D Book of Evil:树的直径【结论】
题目链接:http://codeforces.com/problemset/problem/337/D 题意: 给你一棵树,n个节点. 如果一个节点处放着"罪恶之书",那么它会影响 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 Claire and her little friend, ykwd, are travelli ...
- BZOJ 2282 树的直径
SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到"使得路径的两端都是城市",如果不是链那不就不止两端了吗--怎么这么机智的感 ...
- 历届试题 大臣的旅费(树的直径)
试题 历届试题 大臣的旅费 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为 ...
- hdu 4679 树的直径
1 /* 2 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 3 树的直径(Diameter)是指树上的最长简单路. 4 直径的求法:两遍BFS (or DFS) ...
- [蓝桥杯][2013年第四届真题]大臣的旅费(树的直径)
题目描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- 历届试题 大臣的旅费(深搜 树的直径)
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- P3629-[APIO2010]巡逻【树的直径】
正题 题目大意 刚开始一棵树,在树中加入k条边(k<=2)使得这些边都得走过的情况下,每个点都到达并回到原点的最少边. 解题思路 首先我们发现如果不加边的话答案是2∗(n−1)2*(n-1)2∗ ...
最新文章
- log4j配置文件详解
- js 对有“命名空间”的表单做深度解析
- 【小知识点】解决Chrome动画”卡顿”的办法
- Android编译32或64位程序
- Jquery对象本质和隐式迭代
- QT信号与槽-启动系统程序以及相关控件介绍
- layui弹框提示层:倒计时(layui-font-red颜色定义)
- # 字节数组转uint32_字节跳动客户端校招面经(21届秋招内推)
- ubuntu linux开机启动自动加载ko驱动程序_一文讲透 CentOS 开机流程
- mysql主从复制原理详解_深入研究MySQL(三)、主从复制原理及演示
- java输入年月输出日历_Java实现按年月打印日历功能【基于Calendar】
- 【Centos】【Linux】如何杀掉进程——【进程杀手】2020-12-01
- 前端基础学习之Sass
- win10清理_别人都说win10不需要装电脑管家,那电脑产生的垃圾该怎么清理呢
- LoadLibrary()动态调用dll失败,GetLastError()返回126
- MATLAB——画图(经典)
- 最大值减最小值等于区间长度_数理统计第19讲(区间估计概念,枢轴量法)
- 计算机科学与技术需要什么电脑配置,如果你要配置一台计算机,需要购买的硬件配置有哪些,主要技术参数是什么?...
- 使用树莓派GPIO17和GPIO18连接DS18B20温度传感器(关于DS18B20的时序设置)
- 微信小程序富文本中图片溢出,使用max-width无效
热门文章
- 2020中国最佳雇主榜揭晓,友邦人寿、上海迪士尼等15家企业入选
- 百信银行算法工程师 校招一面面经
- ORACLE18C具有什么特性,Oracle 18c 必须掌握的新特性 Sharding系列(3) -- Sharding对象说明...
- stm32滴答计时器_STM32——系统滴答定时器
- 2022内蒙古最新水利水电施工安全员模拟考试试题及答案
- LoadRunner下载、安装与使用 | VUGen、Controller、Analysis | 性能测试笔记
- 亚马逊一直停留在身份验证_如何为您的Amazon帐户启用两因素身份验证
- python 控制语句 ‘混泥土’ 循环 上
- 面试官爱问Spring初始化?别急,看完这篇文章,咱去吊打他
- 保护环(GuardRing)