树的中心
时间:2020-10-16
本文章向大家介绍树的中心 ,主要包括树的中心 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。
请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。
输入格式
第一行包含整数 n。
接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。
输出格式
输出一个整数,表示所求点到树中其他结点的最远距离。
数据范围
1≤n≤10000,
1≤ai,bi≤n,
−10^5≤ci≤10^5
输入样例:
-
5
-
2 1 1
-
3 2 1
-
4 3 1
-
5 1 1
输出样例:
2
分析:
树的中心:树中找到一个点,该点到树中其他结点的最远距离最近。
为求得当前点到树中其他节点的最远距离,有两种遍历方式:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int N = 10000+10; 5 int head[N],nexts[N*2],ver[N*2],edge[N*2]; 6 int tot,INF=0x3f3f3f3f; 7 int down1[N],down2[N],up[N],p[N]; 8 void add(int x,int y,int z){ 9 ver[++tot]=y,edge[tot]=z; 10 nexts[tot]=head[x],head[x]=tot; 11 } 12 //子节点更新父节点 13 int dfs_down(int x,int father){ 14 down1[x]=down2[x]=-INF; 15 for(int i=head[x];i;i=nexts[i]){ 16 int y=ver[i],z=edge[i]; 17 if(y==father) continue; 18 int d=dfs_down(y,x)+z; 19 if(d>down1[x]){ 20 down2[x]=down1[x],down1[x]=d; 21 p[x]=y; 22 } 23 else if(d>down2[x]) down2[x]=d; 24 } 25 if(down1[x]==-INF&&down2[x]==-INF) down1[x]=down2[x]=0; 26 return down1[x]; 27 } 28 //父节点更新子节点 29 void dfs_up(int x,int father){ 30 for(int i=head[x];i;i=nexts[i]){ 31 int y=ver[i],z=edge[i]; 32 if(y==father) continue; 33 if(p[x]==y) up[y]=max(up[x],down2[x])+z; 34 else up[y]=max(up[x],down1[x])+z; 35 dfs_up(y,x); 36 } 37 } 38 int main(){ 39 int n; 40 scanf("%d",&n); 41 for(int i=0;i<n;i++){ 42 int x,y,z; 43 scanf("%d%d%d",&x,&y,&z); 44 add(x,y,z); 45 add(y,x,z); 46 } 47 dfs_down(1,0); 48 dfs_up(1,0); 49 int res=INF; 50 for(int i=1;i<=n;i++){ 51 res=min(res,max(down1[i],up[i])); 52 } 53 printf("%d",res); 54 return 0; 55 }
原文地址:https://www.cnblogs.com/pangbi/p/13828831.html
- KVM+Qemu+Libvirt实战
- 内核级虚拟化技术
- tomcat配置ROOT目录和多站点
- IntelliJ IDEA使用(一)基本设置与类、方法模板设置
- JS魔法堂:从void 0 === undefined说起
- Maven(三)在Eclipse中使用Maven与Maven坐标
- Nginx多站点设置及负载均衡
- Maven(二)Maven项目的创建(命令、myeclipse)及生命周期
- JS魔法堂:初探传说中的setImmediate函数
- 配置nginx.conf实现负载均衡
- Maven(一)初识Maven
- MySQL(十一)之触发器
- 用CSS3在火狐浏览器中实现倒影
- MySQL(十)之视图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Adminer 简单的利用
- Xserver免脱壳解密APP
- Flask 入门系列教程(三)
- 数据分析入门系列教程-微博热点
- 数据分析入门系列教程-常用图表
- PyTorch中的model.zero_grad() vs optimizer.zero_grad()
- Flask 入门系列教程(四)
- 代码审计
- ELF文件格式的详解
- 一个开源的RTOS的Chibios的评测
- CS学习笔记 | 25、邮件防御
- CS学习笔记 | 26、杀毒软件
- Python-pymysql
- 我又踩坑了!如何为HttpClient请求设置Content-Type标头?
- 在CentOS7上安装开源Verilog仿真工具EpicSim