1073. 树的中心(树形dp)[通俗易懂]

1073. 树的中心(树形dp)[通俗易懂]给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。输入格式第一行包含整数 n。接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示所求点到树中其他结点的最远距离。数据范围1≤n≤10000,1≤ai,bi≤n,1≤ci≤105 输入样例: 5 2 1 1 3 2 1 4 3 1 5 1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。

请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。

输入格式
第一行包含整数 n。

接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。

输出格式
输出一个整数,表示所求点到树中其他结点的最远距离。

数据范围
1≤n≤10000,
1≤ai,bi≤n,
1≤ci≤105

	输入样例:
	5 
	2 1 1 
	3 2 1 
	4 3 1 
	5 1 1
	输出样例:
	2

题解
树形dp,两次dfs

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
const int M = 2 * N;
const int INF = 0x3f3f3f3f;
struct Edge{ 

int v,next,w;
}edge[M];
int head[N],cnt;
int res = INF,root;
int f[N][3];
void add(int u,int v,int w){ 

edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
int dfs1(int u,int fa){ 

for(int i = head[u];~i;i = edge[i].next){ 

int v = edge[i].v,w = edge[i].w;
if(v == fa)continue;
int t = dfs1(v,u) + w;
if(t >= f[u][0])f[u][1] = f[u][0],f[u][0] = t;
else if(t > f[u][1])f[u][1] = t;
}
// cout<<u<<" "<<f[u][0]<<" "<<f[u][1]<<endl;
return f[u][0];
}
void dfs2(int u,int fa){ 

for(int i = head[u];~i;i = edge[i].next){ 

int v = edge[i].v,w = edge[i].w;
if(v == fa)continue;
if(f[u][0] == f[v][0] + w)f[v][2] = f[u][1] + w;
else f[v][2] = f[u][0] + w;
if(u != root)f[v][2] = max(f[v][2],f[u][2] + w);
dfs2(v,u);
}
int tt = max(f[u][0],f[u][2]);
// cout<<u<<"-"<<f[u][0]<<" "<<f[u][2]<<endl;
res = min(res,tt);
}
int main(){ 

int n;
cin>>n;
memset(head,-1,sizeof head);
int x,y,w;
for(int i = 0;i < n - 1;i ++){ 

cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
root = 1;
dfs1(root,-1);
dfs2(root,-1);
cout<<res<<endl;
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168672.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 关于pfx证书和cer证书

    关于pfx证书和cer证书Pfx证书,同时包含了公钥信息和私钥信息Cer证书只包含公钥信息如果客户端与网站通信时需要用到私钥(基本所有需要数字证书的网站都会用到私钥),则cer证书是无法正常访问网站的,网站会提示“该页要求客户证书”由于cer证书只包含公钥信息,一般只能用于解密使用(解密该公钥对应的私钥加密的数据)。Pfx证书既可以导出为pfx证书,也可以导出为cer证书。Pfx证书导出时,会提示是…

  • ts文件怎么合并转换成mp4?

    ts文件怎么合并转换成mp4?ts文件怎么合并转换成mp4?现在小编就来教大家一个方法吧,直接将多个ts视频文件直接合并成mp4格式,大家想不想学会这个技能呢?跟我一起往下看吧。

    2022年10月29日
  • python读取图片属性信息

    python读取图片属性信息从照片里面获取GPS信息。可交换图像文件常被简称为EXIF(Exchangeableimagefileformat),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据,EXIF信息不支持png,webp等图片格式。Python中使用ExifRead包读取图片的属性信息,安装方式为:pipinstallexifread使用exifread.process_file获取图像的信息:img_path=r”b…

  • 2、Tomcat集群实战,并用Nginx实现负载均衡(win环境)

    2、Tomcat集群实战,并用Nginx实现负载均衡(win环境)

  • 面试:最易被忽略的12种高级错误

    面试:最易被忽略的12种高级错误

  • spssk均值聚类报告_K均值聚类

    spssk均值聚类报告_K均值聚类机器学习中的k均值聚类属于无监督学习,所谓k指的是簇类的个数,也即均值向量的个数。算法初始状态下,要根据我们设定的k随机生成k个中心向量,随机生成中心向量的方法既可以随机从样本中抽取k个样本作为中心向量,也可以将中心向量固定在样本的维度范围之内,避免中心向量过偏远离大多数样本点。然后每个样本点需要与k个中心向量分别计算欧氏距离,取欧氏距离最小的中心向量作为该样本点的簇类中心,当第一轮迭代完成之后,…

    2022年10月28日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号