HDU - 2196 - Computer( 树形dp )

HDU--2196---Computer(树形DP) 这道题还是比较不容易理解的主要是多用了一个dfs,多饶了一个弯这道题符合树形DP的特征,可以把问题转化为一棵树对于每一个点,计算出以此点为根的子树中的第一长的枝和第二长枝,都存起来这是一个相当重要的预处理当图转为树的时候,对于每一个点其最远点有两种情况(两种情况取最优)1.返回父节点,来寻找最远点2.直接继续向下找,找到最远点对于第二种情况,由于向下找,长度必定为其最长枝的长度,预处理中已经找到, 阅读详情
题目链接:点击进入
题目

在这里插入图片描述
在这里插入图片描述

题意

对树上的每个点,求出离这个点最远的点的距离是多少

思路

对于一个节点,最远距离可能在该节点的子树方向上,也可能在该节点的父节点方向上,两次dfs,第一次求出该节点子树方向上最长距离,第二次求父节点方向上的最长距离,两次取最大值就是这个点的最大距离
dp [ u ] [ 0 ] :在 u 的子树下离 u 的最远距离是多少
dp [ u ] [ 1 ] :在 u 的子树下( 和 dp [ u ] [ 0 ] 不是同一孩子 )u 的次远距离是多少
dp [ u ] [ 2 ] :通过 u 的父节点的最远距离是多少
对于子树方向上的最远距离
dp [ u ] [ 0 ] = max ( dp [ u ] [ 0 ] , dp [ v ] [ 0] + w )
对于父节点上的最远距离
如果 dp [ u ] [ 0 ] == dp [ v ] [ 0 ] + w( 即当前 u 的子树的最大距离就是从 v 过来的,所以对于 v 来说,父节点方向上,就不能取 dp [ u ] [ 0 ] )

		dp [ v ] [ 2 ] = max ( dp [ u ] [ 2 ] , dp [ u ] [ 1 ] ) + w ;	

否则

		dp [ v ] [ 2 ] = max ( dp [ u ] [ 2 ] , dp [ u ] [ 0 ] ) + w ;
代码
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<bitset>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define max(a,b) a>b?a:b
//#define min(a,b) a<b?a:b
//#define int long long
//#define double long double
//#ifndef ONLINE_JUDGE  freopen("data.in.txt","r",stdin);
//freopen("data.out.txt","w",stdout); #endif //???t?áè? 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int Mod=998244353;
const double eps=1e-9;
const int N=26;
const int mod=1e8;
const int maxn=1e6+10;

/*--------------------------------------------*/ 
inline int read()
{
    int data=0,w=1; char ch=0;
    while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();
    return data*w;
}
/*--------------------------------------------*/

int n,m,a[maxn];
int dp[10010][3];
int head[maxn],tot;
bool vis1[maxn],vis2[maxn];
struct node
{
	int w;
	int to;
	int next;
}edge[maxn];
void init()
{
	memset(head,-1,sizeof(head));
	memset(dp,0,sizeof(dp));
//	memset(vis1,0,sizeof(vis1));
//	memset(vis2,0,sizeof(vis2));
	tot=0;
}
void add(int u,int v,int w)
{
	edge[tot].w=w;
	edge[tot].to=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}

void dfs1(int pos,int fa)
{
	for(int i=head[pos];i!=-1;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa) continue;
		dfs1(v,pos);
		int tmp=dp[v][0]+edge[i].w;
		if(tmp>=dp[pos][0])
		{
			dp[pos][1]=dp[pos][0];
			dp[pos][0]=tmp;
		}
		else if(tmp>dp[pos][1])
			dp[pos][1]=tmp;
	}
}

void dfs2(int pos,int fa)
{
	for(int i=head[pos];i!=-1;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa) continue;
		if(dp[pos][0]==dp[v][0]+edge[i].w)
		{
			dp[v][2]=max(dp[pos][2],dp[pos][1])+edge[i].w;	
		}
		else
		{
			dp[v][2]=max(dp[pos][2],dp[pos][0])+edge[i].w;
		}
		dfs2(v,pos);
	}
}

int main()																						
{	
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);
	while(cin>>n)
	{
		init();
		for(int i=2;i<=n;i++)
		{
			int u,w;
			cin>>u>>w;
			add(u,i,w);
			add(i,u,w);
		}
		dfs1(1,-1);
		dfs2(1,-1);
		for(int i=1;i<=n;i++)
			cout<<max(dp[i][0],dp[i][2])<<endl;
	}
	return 0;
}
瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程 本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。 阅读详情

相关推荐

Java 网络编程(超级详细)

1. 网络编程 1.1 网络编程概述 计算机网络 是指将地理位置相同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 1.2 网络编程三要素 1、IP地址 要想让网络中的计算机能够互相通信,必须为计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,而IP地址就是这个标识号,也就是设备的标识。 2、端口 网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程

imByte的博客 3万+

HDU2196:树形DP

HDU2196 题解 在一棵树上,求每个结点能到达的最远距离。 设结点到子树的最大距离为深度。那么结点能到达的最远距离可能为深度(1),也可能为经过先到父结点再到兄弟结点的子树(2),或者直接一直往上走到另一边(3)。 如果u的父节点到子树的最大距离经过u,那么u的最远距离为max(1,2,3)。 如果u的父节点到子树的最大距离不经过u,那么max(2,3)。 先自底向上dfs一...

FlyingJack 378

以LAN8720A为例的以太网硬件设计方案

输入时钟(XTAL1/CLKIN,XTAL2):推荐外加25MHz(性价比较高)晶振为PHY芯片提供时钟,PHY芯片内部PLL将其倍频为50MHz来使用,亦可使用直接使用50MHz晶振。三位MODE通过高低电平组合分别对应以上8种模式 ,包含10M半双工,10M全双工,100M半双工,100M全双工,是否启用自协商协议,CRS是否有效等。VDDCR:1.2V电源,可由芯片内部稳压电源提供,亦可由外部电源提供,由外部电源提供可降低芯片功耗。REF_CLK:参考时钟,由MAC或外部时钟晶振向PHY芯片提供。

weixin_46154042的博客 5884

HDU - 2196(树形dp)

给出一颗树,求树中的每个顶点到其他所有顶点距离的最大值。 经典树形dp #include &lt;bits/stdc++.h&gt; using namespace std; const int maxn=1e4+100; int n,dp[maxn],dpf[maxn],f[maxn][3];//dp为孩子节点到这个点的最远距离,dpf为父节点到这个节点的最远距离,最后取max stru...

XFire的博客 767

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4195

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

HDU - 2196 Computer(树形DP)

HDU - 2196 Computer(树形DP) #include<iostream> #include<cstring> #include<vector> using namespace std; typedef pair<int,int> PII; const int N = 10010; vector<PII> g[N]; int d1[N],d2[N],df[N],dn[N]; int n; void dfs_d(int u,int

00后的博客 494

从零构建eSIM RSP服务:云原生架构与GSMA合规实践

本文详细阐述了从零开始构建一个符合GSMA SAS-SM安全标准的云原生eSIM RSP服务的完整路径。内容涵盖云原生基础设施选型、容器化部署、GSMA标准接口集成,并重点分享了通过SAS-SM安全审计的实战经验与避坑指南,为物联网及智能设备企业自建可控的远程SIM配置服务提供了系统性的解决方案。

weixin_29322553的博客 458

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

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

橘嘉禾 148

3D点云修复实战:用PCN网络快速补全缺失的激光雷达数据(附代码)

本文详细介绍了PCN(Point Completion Network)网络在3D点云修复领域的实战应用。针对激光雷达数据常见的缺失问题,PCN通过端到端的深度学习架构,直接处理原始点云,实现由粗到精的快速补全。文章深入解析了其核心思想与编码器-解码器架构,并提供了完整的环境搭建、数据准备、模型实现、训练评估及在真实场景下的优化策略与代码示例,为自动驾驶、机器人等领域的开发者提供了高效的数据修复解决方案。

weixin_29041195的博客 392

Orange3实战教程:转换---预处理

部件提供了多种预处理方法,这些方法可以在单个预处理流程中组合使用。某些方法也可作为独立部件提供,支持更高级的技术和参数调整。连接到测试与评分:在交叉验证的每个批次中应用预处理器,随后学习器的预处理器会作用于预处理后的子集。连接到学习器:覆盖学习器的默认预处理流程,仅应用自定义流程(各学习器的默认步骤详见其文档)。直接连接到原始数据并输出预处理后的数据集,可能导致模型过拟合。:从原始数据中随机选择固定数量或百分比的特征,主要用于高级测试或教学用途。的预处理器输入,同时传入数据和学习器(如。

err2008的专栏 147

HDU 2196 Computer(树形dp)

HDU2196Computer(树形dp) 给出一个n个节点的无根树,求每个节点所能到达的最远距离。

鱼香rose_的博客 1643

YOLOv11 改进 - C2PSA | C2PSA融合Mask Attention掩码注意力,可学习掩码矩阵破解低分辨率特征提取难题 | 2025 预印

本文提出了用于低分辨率图像分割的MaskAttn - UNet框架,并将其核心的掩码注意力机制集成到YOLOv11中。传统U - Net类模型难以捕捉全局关联,Transformer类模型计算量大,而掩码注意力机制通过可学习的掩码,让模型选择性关注重要区域,融合了卷积的局部效率和注意力的全局视野。其工作流程包括特征适配、掩码生成、定向注意力计算和特征融合。我们将掩码注意力机制代码集成到YOLOv11中。

魔改工程师的博客 403

hdu2196Computer【树形dp】

题目:hdu2196Computer点击打开链接 题意:给出yixie

大神养成中..... 3026

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Statistics and Machine Learning Toolbox

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

HDU2196.Computer(树形DP)

HDU2196.Computer(树形DP) 题目传送门 思路:每个结点的最大距离转化为到子树结点的最大距离与到上部最大的距离的较大值。到上部最大距离要分两种情况(在最长距离子树上和不在最长距离子树上)通过两次DFS就可完成状态转移。具体看代码。 AC代码: #include<bits/stdc++.h> using namespace std; const int N=1e5+5; ...

Harris-H的博客 579

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Hdu2196-Computer (树形dp)(经典题)

传送门:Computer 题意:有 n 个点,通过 n-1 条边连成一棵树,每条边有一个权值,求从每个点出发的简单路径的最大长度。 思路:树形dp 首先以 1 为根建树,这样每个点能走的最大路径有两种情况:往下沿着子节点走或往上沿着父结点走。假设根节点为 rt,我们定义: dp[rt][0] 表示以 rt 为根的子树上的节点到 rt 的最长距离。 dp[rt][1] 表示以 rt 为根的...

Stupid_Turtle的博客 718

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

HDU 2196 Computer(树形DP经典入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 解题思路: 先思考一下暴力的方法: 建树(双向建边),如果有n个点,每次选择那个点作为根节点,dfs,记录最深深度 这样的话n个点,每次dfs遍历剩下n-1的点,复杂度O(N²),我试了一下,超时了。 于是我去参考了一下大佬的代码,发现了树形DP这样的东西。 树形DP做法...

shadiao.的博客 345

HDU2196 Computer 树形DP

但以2为例,他的反方向最大就不能再从1->2这个路径找了,应该从1->3这个路线开始找,即次大值。也就是说,我们需要获得当前点的正距离最大值和正距离最大值的终点(上图5到6),这个情况我们直接从根往下遍历就好了。故令f[i][j]表示为结点j的最大正向(i=0)、次大正向(i=1)与最大反向(i=2)要找次大值得话,显然我们记录最大值的终点是不方便的,应该记录走到最大值那条路线的子节点。既然要查找每个节点的最远到达距离,由于该图是个树,我们就找从。另外,根节点的正向最大路线与反向最大路线是一样的。

2301_79917474的博客 416

L - Computer(HDU2196 ,树形DP,换根法)

L - Computer(HDU2196 ,树形DP,换根法) 题目 :传送门 思路见注释 代码 : * 换根法dp: 先把无根树化为有根树 第一遍dfs,对于顶点u,求u的子树到u的最大和次大距离 第二遍dfs,将树化为顶点u为根,u的子树到u的最大距离和次大距离 对于u的最大距离就是res[u],而u的次大距离是用来儿子换根的时候进行状态转移 */ #include<bits/s...

Dch19990825的博客 327

hdu 2196 Computer 树形dp

HDU 2196 Computer 题目传送门 题目大意:一开始有一台电脑编号为1,然后接下来把剩下的电脑全连进去,每一行给出该台电脑的父亲编号和连接的权值,问最后每台电脑能到达最远的权值为多少。 分析:乍一看,很容易想到用dfs直接搜,然后分析对于每台电脑,我们将m电脑连入n电脑,相当于指向了n电脑,然后其他的电脑又可能连向m,发现每个点有出度和入度。那么我们就能想到他能到达的最远距离一定是出度...

yp0413170331的博客 178

HDU2196 Computer(树形dp)

题目链接 题意 在n个结点的树中,边有权值,找到每个结点到最远的结点的距离 解法 有两种解法,一种是利用树的直径,另一种是树形dp 我的做法是树形dp的。 对于一个节点i来说,他最长的距离可以是向它的子树方向走,也可以向父节走, 如果向父节点走还有可能向父节点的子树走,因此需要注意的是父节点的子树包含了自己的子树,父节点有两种情况,父节点最长的路径没有经过i点和经过i点,没有经过i点则直接加上i到...

Zain的博客 185

HDU-2196-Computer 树形DP

大致题意:每一台电脑和某些电脑相连,所有电脑构成了一颗树。现在,需要求每台电脑传送信息的最大距离,也就是到达叶子节点的最大距离。很经典的一道树形DP,大致思路:任选一个节点作为根节点,然后用DFS跑出每个节点向下的最大距离和次大距离。然后再进行一次dfs,找出每个节点向父节点可以走的距离,最后比较一下就是结果了。(解题过程不能说得太清楚了,略加提示,请仔细思考)。 #include<bi...

qq_43141496的博客 266

HDU2196 Computer(树形dp+换根)

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:求一棵树中距离每一个节点的最大路径权值和。 思路:假如固定了起点,那么我们通过一遍dfsdfsdfs就可以得到距离根节点中最远的点的路径权值和,但是这题需要输出nnn个点的答案,显然对每一个点的跑一遍dfsdfsdfs是不可行的。所以需要进行优化。 可以使用一种换根的技巧,在预处理之后可以...

yiqzq的博客 473

【hdu】2196 Computer【树形dp】

题意: 给出一棵树,树上边的长度不同,问树上的每个节点到别的节点的最远距离是多少 题解: 树形dp的经典应用,一个节点b的最长距离有三种情况,1.来自他的子树2.与他父节点距离最大的节点+他与他父节点的距离 第二种情况分为两种3.是与他父节点距离最大的节点在以父节点为根的子树中4.来自以父节点为根的子树之外的树 上面3.中如果节点b在这条最长路中的话就不行了,所以我们还要记下父节点的第二

a709743744的博客 463

hdu 2196 Computer(DP-树形DP)

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

不戚的专栏 703
上一篇: 2021牛客暑期多校训练营5 - B - Boxes ( 概率问题 )
下一篇: CodeForces - 1324F Maximum White Subtree ( 树形dp )
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值