HDU2196 - Computer(树的直径+DP)

华为OD机试真题新系统-空间占用计算(Py/Java/C/C++/Js/Go) 华为OD机试新系统机试真题 【空间占用计算】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【空间占用计算】。 阅读详情

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2196


题目大意:

给定一个无向连通无环图,求每个节点到达的最远的节点的距离。


解题过程:

上午看了一下DP进阶之路的PDF,突然想学树型DP。然后找到了这个题,之前做了一个POJ的BFS求树的直径的,这次再来一发DP的。


题目分析:

由于题目给的是无向连通无环图,这里构造出一颗树来,不妨假设节点 1 为根。

那么对于任意一个节点,他能到达的最远的节点一定是他子树中的一个节点,或者经过他父亲到达的一个节点。

这里可以经过一次DFS求出每个节点到他子树中最远的节点的距离。

然后第二次DFS的时候求出每个节点经过他根节点能到达的最远的距离,求经过根节点能到达的最远的距离时,需要当前节点到根节点的距离加上根节点到最远的节点的距离。不过要注意的是,可能当前节点在根节点最远距离的路径上。

这里解决的方法是,求出每个节点最远的距离和次远的距离,如果当前节点在最远的距离路径上那么就选择次远的距离,判断是否在路径上需要记录下最远的距离是由那个儿子求出来的。


AC代码:

#include <bits/stdc++.h>
using namespace std;

const int MAX = 11234;
const int INF = 0x3f3f3f3f;

int n;
vector<pair<int, int> > edge[MAX];

//dis1记录最远距离,dis2记录次远距离,num用来标记最远距离由那个节点而来的
int num[MAX], dis1[MAX], dis2[MAX], dp[MAX];


void read() {
    for (int i = 1; i <= n; i++) {
        edge[i].clear();
    }
    memset(dp, 0, sizeof(dp));
    for (int i = 2; i <= n; i++) {
        int v, w;
        scanf("%d %d", &v, &w);
        edge[v].push_back(make_pair(i, w));
    }
}

void dfs1(int u) {
    dis1[u] = 0;
    //这里的含义是,对于每个节点求他所有儿子节点的最远距离,那么当前节点的最远距离就是到儿子节点的距离加上儿子节点的最远距离
    //显然对于一个叶子节点,最远距离是0
    for (int i = 0; i < edge[u].size(); i++) {
        int v = edge[u][i].first;
        int w = edge[u][i].second;
        dfs1(v);
        if (dis1[v] + w > dis1[u]) {
            dis1[u] = dis1[v] + w;
            num[u] = v;
        }
    }
    //和上一步相似,求次远距离
    dis2[u] = -INF;
    for (int i = 0; i < edge[u].size(); i++) {
        int v = edge[u][i].first;
        int w = edge[u][i].second;
        //当前距离不能是最远距离
        if (v != num[u] && dis1[v] + w > dis2[u]) {
            dis2[u] = dis1[v] + w;
        }
    }
}

void dfs2(int u) {
    for (int i = 0; i < edge[u].size(); i++) {
        int v = edge[u][i].first;
        int w = edge[u][i].second;
        //dp[u]的含义是,当前节点经过父节点能到达的最远的距离
        //如果当前节点在最远距离的路径上,那么用次远距离,否则用最远距离
        if (v == num[u])
            dp[v] = max(dp[u], dis2[u]) + w;
        else
            dp[v] = max(dp[u], dis1[u]) + w;
        dfs2(v);
    }
}

void go() {
    dfs1(1);
    dfs2(1);
    //输出每个点的最远距离
    for (int i = 1; i <= n; i++) {
        printf("%d\n", max(dp[i], dis1[i]));
    }
}

int main() {
    while (~scanf("%d", &n)) {
        read();
        go();
    }
}
YOLOv11改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务 SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。 阅读详情

相关推荐

无人机通信安全渗透测试:从信号拦截到GPS欺骗的完整攻防框架

在物联网和智能设备普及的背景下,无线通信安全成为关键基础设施防护的核心环节。其原理在于,通过软件定义无线电等设备对空中的射频信号进行捕获、分析与模拟,从而评估通信协议在加密、认证和防重放等方面的脆弱性。这项技术的价值在于,它能主动发现并修复系统设计缺陷,避免因信号被拦截或欺骗导致设备被劫持、数据泄露等重大安全事件。其应用场景广泛,涵盖消费电子、工业控制及关键基础设施等领域。本文聚焦于无人机这一典型移动物联网终端,深入探讨如何构建一套针对其通信链路的渗透测试方法论,其中涉及信号拦截、协议逆向等关键技术,旨在为

weixin_34128237的博客 391

HDU2196(Computer 经典换根dp 求一棵树中所有节点能达到的最长距离)

题目 博主讲的很好:https://blog.youkuaiyun.com/u013480600/article/details/21831363 #include<bits/stdc++.h> #define en '\n' #define m(a,b) memset(a,b,sizeof a) using namespace std; typedef long long ll; const ...

qq_42576687的博客 518

C# NX二次开发:两种过滤器设置方案的实战解析与场景适配

本文深入解析C# NX二次开发中的两种过滤器设置方案:AddFilterHandler回调与MaskTriple属性设置。通过实战案例对比其性能差异与适用场景,帮助开发者根据需求选择最优方案,提升NX插件开发效率与交互体验。特别针对BlockStyler集成场景提供专业建议,是NX二次开发者的实用指南。

weixin_33739646的博客 844

树形dp hdu 2196

题目链接:hdu 2196 题目大意:有n台电脑,每台电脑之间都用电缆相连,当然了这是n-1边树。然后问每台电脑所能到达的最远电脑的距离。 思路:首先第一反应思路有点像单源最长路径。。。但是有n台电脑,都来一发估摸着n^2logn的时间复杂度(果断t了)。后来想想又有点树的分治的感觉,分枝节处理,,,,然后dp优化。。。就可以了。。。。。。。。。。。。。。来一发dfs找到离1(之所以选1是因为...

weixin_30731305的博客 124

FastAPI + LLM 实战:5分钟搞定本地模型API服务部署(含避坑指南)

本文详细介绍了如何使用FastAPI和LLM(大语言模型)快速部署本地API服务,涵盖环境准备、模型集成、性能优化及避坑指南。通过实战示例,帮助开发者在5分钟内完成从零到生产的部署过程,提升AI应用开发效率。

weixin_29062963的博客 105

S7-1200 Modbus TCP客户端配置实战:从基础设置到数据交互详解

本文详细介绍了S7-1200 Modbus TCP客户端的配置方法,从基础设置到数据交互的完整流程。涵盖硬件准备、TIA Portal配置、MB_CLIENT指令参数详解、数据缓冲区管理及实战测试,帮助工程师快速掌握西门子PLC与Modbus TCP通信的关键技术。

fire9的博客 311

HDU-2196 Computer(树dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:给出一棵树,让求每个点能到达的最远距离 思路: dp[u][0]表示u的子树中所能达到的最远距离 dp[u][1]表示u的子树中所能达到的次远距离 dp[u][2]表示u的父亲结点所能达到的最远距离 难点是在求dp[u][2]上 代码:#include<bits/stdc++.h>

huatian5的博客 296

从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南

本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。

weixin_42543046的博客 153

hdu 2196 Computer(树形DP)

Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3075 Accepted Submission(s): 1561 Problem Description A school bought the fi...

weixin_30576827的博客 272

YOLOv12改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv12高效涨点改进专栏》提供500+创新改进方案,涵盖卷积、主干网络、注意力机制等模块优化,适用于检测、分割等任务。改进点来自顶会论文和个人经验,支持多种模型版本和任务场景。专栏包含详细教程、数据集增强、性能评估工具等,帮助科研人员快速实现模型优化和论文发表。提供完整运行项目和环境配置指导,适合计算机及相关专业研究人员使用,持续更新保障长期科研需求。

Ai缝合怪、助力小伙伴高效发论文 2309

C#与硬件开发入门:从零开始搭建你的第一个硬件项目

《C#硬件开发入门指南》摘要:本文介绍了使用C#进行硬件开发的基础知识,重点讲解了通过串口通信控制硬件设备的实现方法。内容包括:C#硬件开发优势、必备基础知识、环境准备步骤,并提供了一个完整的串口数据读取示例代码。文章还给出了进阶学习建议和常见问题解决方案,帮助开发者快速掌握C#与硬件设备通信的基本技能,为进一步开发物联网、工业控制等应用打下基础。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 974

Computer HDU - 2196 (树形dp || 树的直径)

Computer HDU - 2196 (树形dp || 树的直径) 题目链接 题目大意: 给定一棵树,知道相邻结点的距离,问对于每一个结点,和距离它最远的结点之间的距离是多少。 Input: 5 n个结点 1 1 表示2和1之间的距离是1 2 1 表示3和2之间的距离是1 3 1 表示4和3之间的距离是1 1 1 表示5和1之间的距离是1 ...

deerly_的博客 677

【CT/电镜 重建教程 1.1】层析成像的精确实空间迭代重建算法(RESIRE)

在此,我们报告了RESIRE算法的发展用于准确的断层重建。与实空间迭代算法相比,RESIRE使用傅里叶切片定理或Radon变换作为正向投影,使用线性变换作为反向投影,两者都具有高精度。与EST和GENFIRE相比,RESIRE是一种实空间迭代算法,可以在并行计算中实现快速运行时间。

2401_87064292的博客 1062

【树形DP_树的直径】HDU 2196 Computer

HDU 2196 Computer 题意:给一棵树,求每个结点的最大距离(从该结点到达所有叶子结点中的最大距离)并输出。题目要求输入真的很迷,每一行(从2开始)代表的结点u和输入结点v之间的边的权值是w。嗐,真的迷。读了好久才读懂。QAQ 【今天才知道原来以下做法是求树的直径的做法,first[x] + upp[x]的最大值就是树的直径】 思路:我们任取一个结点作为根结点,将无根树转...

L_X_ 341

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

树形dp || 树的直径性质 hdu-2196 computer

Computer HDU - 2196 A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to on...

yhb的博客 219

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

hdu 2196 Computer(树的直径\树上dp)

题目链接 Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5702    Accepted Submission(s): 2854 Problem Description A schoo

fouzhe的博客 603

HDU - 2196 Computer (树形DP,树的直径相关)

???? ???? ???? 题意:求与每个点距离最远的点的距离 选择一个根,求出他向下和向上分别的最大值,两者再求一个最大值即可。 这里的DP也可以用在求直径上(树中存在负权的时候dfs/bfs不再适用), 把最后一步换成dp0与dp2求和即可 int n; int id[MX];//i结点的最深链在哪个儿子 ll dp[MX][3]; int head[MX],tot; struct IN{int v,w,...

欢迎光临 我的心 252

Hdu 2196 Computer (树的直径 或 树形DP)

貌似这题是树形DP的经典题,树形DPz

whyorwhnt的专栏 1016

hdu 2196 Computer 树形DP或者树的直径

Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5805    Accepted Submission(s): 2909 Problem Description A school bought t

swust_fang 603

HDU 2196 Computer (树型dp/树直径)

Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31005    Accepted Submission(s): 3895 Problem Description A school bought

HHH_go_的博客 389

Computer(HDU2196+树形dp+树的直径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每个节点能够连接的最远距离。 思路:树形dp,由于本题是一棵有根树(根节点为1),所以每个节点能到达的最远距离为max(从父亲节点往上传并到达根节点的其他子树的最远距离,从子节点...

di6499的博客 165

HDU 2196 Computer(树形dp+换根法+树的直径)

题意:给出一棵树,求离每个节点最远的点的距离 分析: 方法一:贪心做法,不会证明,找到直径的两个端点,分别dfs一下,求出两端到每个点分别的距离取最大值,树的直径作用很大啊。 方法二:把无根树转化成有根树分析,对于每个节点,维护所有以当前节点为根的子树中距当前节点最远的距离和次远距离,二次扫描(两遍dfs)。 参考:https://blog.youkuaiyun.com/shuangde800/art...

常胜将军的博客 658

hdu2196-树形dp|树的直径-Computer

http://acm.hdu.edu.cn/showproblem.php?pid=2196 给定一个网络,是一个图,求每个节点到最远节点的距离。。 1 树的直径。 即树上的最长简单路(最长的一条线)。然后求出直径的两个端点, 在计算的时候记忆化一下,保存一下他们距离 端点的距离。然后取最远的。( 1 先求出距离一个端点的距离,用直径直接减去是不行的,,因为有的点并不在树的直径上。。

天与云与山与水 397

「HDU-2196」Computer (树形DP、树的直径)

「HDU-2196」Computer 树形dp,树的最长路径(最远点对) 题意 给出一棵nn个结点的无根树,求出每个结点所能到达的最远点的距离。 解法 将无根树转成有根树,并进行两次DFS。 第一次DFS求出每个结点在其子树中的正向最大距离和正向次大距离,记为dp[0][x]和dp[1][x],并标记最长距离所对应的子结点id[i] ,利用id[i]能跳过最大点计算第二大的点; 此时可知...

橘嘉禾 149

HDU-2196 Computer(树的直径+DP)

ComputerTime Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 32752    Accepted Submission(s): 4667Problem DescriptionA school bought the first comput...

Amove 448

HDU2196 Computer (树形dp或树的直径)

题意 给定一个n个点的树,两点之间的距离定义为他们两点之间最短路经过的边数,问对于每个i,其它点距离i最远是多少(n小于等于100000) 题解 首先将这棵树转换为有根树 方法一:(利用树的直径) 求出这棵树的任意一条直径(u,v),然后dfs出u及v到其他任意一个点i的距离,那么对于每一个点,最长的距离是max{dist(u,i),dist(v,i)}max\{dist(u,i),

gankinghand的博客 397
上一篇: UVA11235 - Frequent values(游程编码+线段树)
下一篇: HDU1024 - Max Sum Plus Plus(DP+降维优化)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值