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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python怎么用反三角函数_反三角函数怎么用

    展开全部已知:cosα32313133353236313431303231363533e4b893e5b19e31333366303132=3/5,求α。解:已知:cosα=3/5有:α=arccos(3/5)经查表(或按计算器),得:α≈53.13010235°,或:α≈323.13010235°考虑到三角函数的周期性,得:α≈360°×k+53.13010235°,或:α≈360°×k+323…

    2022年4月7日
    71
  • IOS开发之——Position和AnchorPoint(92)「建议收藏」

    IOS开发之——Position和AnchorPoint(92)「建议收藏」一概述CAlayer中position和anchorPoint属性说明position和anchorPoint示意图二position和anchorPoint属性说明CALayer中有2个非常重要的属性:position和anchorPoint@propertyCGPointposition用来设置CALayer在父层中的位置以父层的左上角为原点(0,0)@propertyCGPointanchorPoint称为“定位点”,“锚点”决定着CALayer身上的哪个点

    2022年10月8日
    3
  • eclipse引入jar包_eclipse导入maven项目

    eclipse引入jar包_eclipse导入maven项目第一步:创建lib文件夹,统一存放需要导入的jar包第二步:将jar复制粘贴到lib文件夹内第三步:选中jar,右键—–》BuildPath—–》AddtoBuildPath然后就可以开心的写和执行代码了

    2025年8月23日
    1
  • java数组反转,Java数组反转

    java数组反转,Java数组反转本篇文章帮大家学习java数组反转,包含了Java数组反转使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。以下实例中我们使用Collections.reverse(ArrayList)将数组进行反转:importjava.util.ArrayList;importjava.util.Collections;publicclassMain{publicst…

    2022年5月18日
    43
  • java详细学习路线及路线图

    java详细学习路线及路线图java详细路线:原文出自点击打开链接本文将告诉你学习Java需要达到的30个目标,学习过程中可能遇到的问题,及学习路线。希望能够对你的学习有所帮助。对比一下自己,你已经掌握了这30条中的多少条了呢?路线Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE。这三块相互补充,应用范围不同。J2SE就是Java2的标准版,主要用于…

    2022年6月12日
    30
  • weakHashMap 用法

    weakHashMap 用法WeakHashMap,此种Map的特点是:当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值举例来说:声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMapremove掉a并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象…

    2022年5月6日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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