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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • log4j学习笔记–ConversionPattern参数详解– RollingFileAppender选项

    log4j学习笔记–ConversionPattern参数详解– RollingFileAppender选项1、rootLogger与rootCategory的区别rootLogger是新的使用名称,对应Logger类rootCategory是旧的使用名称,对应原来的Category类Logger类是Category类的子类,所以,rootCategory是旧的用法,不推荐使用2、格式参数a)例句:log4j.appender.stdout.layout.Conver

    2022年8月22日
    7
  • object.hashcode的作用_java的hashcode方法

    object.hashcode的作用_java的hashcode方法Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。其主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具…

    2022年9月8日
    0
  • 【豆瓣达人总结】做爱做的事,看有趣的人

    【豆瓣达人总结】做爱做的事,看有趣的人惊雀http://www.douban.com/people/4917689/有想法很特别的一位大哥,从另一个角度告诉你什么叫做“人不可貌相”,有位友邻说得好:之所以觉得惊先生特别是因为先生是为数不多思考爱情的帅哥~@东窗未白keledollhttp://www.douban.com/people/keledoll/热血科学心理学女青年,今天才发现她有豆瓣页面。搜索kele

    2022年9月28日
    0
  • 解决iframe嵌套页面问题「建议收藏」

    解决iframe嵌套页面问题「建议收藏」/*如果页面嵌套,跳出嵌套*/if(window.top!=window.self){top.location=this.location;}

    2022年6月26日
    18
  • 一文读懂 SIP 协议

    一文读懂 SIP 协议SIP 是由 IETF 制定的多媒体通信协议 广泛应用于 CS NGN 以及 IMS 的网络中 可以支持并应用于语音 视频 数据等多媒体业务 同时也可以应用于 Presence 呈现 InstantMessa 即时消息 等特色业务 可以说 有 IP 网络的地方就有 SIP 协议的存在 SIP 是类似于 HTTP SIP 可以减少应用特别是高级应用的开发时间 由于 基于 IP 协议的 SIP 利用了 IP 网络 固定网运营商也会逐渐认识到 SIP 技术对于他们的远意义

    2025年6月14日
    0
  • Latex角标(subscript/superscript)

    Latex角标(subscript/superscript)

    2021年9月12日
    269

发表回复

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

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