首页 > 其他分享 >换根dp

换根dp

时间:2024-08-17 11:17:04浏览次数:10  
标签:结点 子树 max up 数组 整棵树 换根 dp

大致步骤


 

换根dp 大致步骤

 

方法一:(up数组)
(1) g[i] 以i为根的子树(不是整棵树),由孩子节点推过来
(2) up[i] i节点往上走的最大属性
(3) f[i] 整棵树(不是子树) 记录一些值

 

方法二:加减法

(1) g[i] 以i为根的子树(不是整棵树),由孩子节点推过来

(2) f[i] 整棵树(不是子树) 记录一些值(通过加减法,用g数组计算f数组)

 

这就是一些通用套路了,下面会详细讲解如何使用

 

深度最大(方法一)


 

第1题     深度最大 查看测评数据信息

给定一个 n 个点的树,请求出一个结点,使得以这个结点为根时,该树深度最大。深度定义为叶子节点到根的简单路径上边的数量最大值。1≤n≤1e6,1≤u,v≤n

输入格式

 

第一行有一个整数,表示树的结点个数 n。

接下来 (n−1) 行,每行两个整数 u,v,表示存在一条连接 u,v 的边。

 

输出格式

 

输出一行一个整数表示你选择的结点编号。如果有多个结点符合要求,输出节点编号最小值。

 

输入/输出例子1

输入:

2

1 2

 

输出:

1

 

样例解释

 

例题1(换根1:up数组)

g(i, 0/1):以i为根的子树,0:次大深度,1:最大深度
通常记录最大的情况下,要记录次大值


第一步. O(n)

如何更新次大值,最大值?
假设v是i的子树,子推父

1) if (g[v][1]+w >= g[i][1])
g[i][0]=f[i][1], g[i][1]=g[v][1]+w //注意顺序,先更新最大值,再更新次大值
son[i]=v //后面解释

2) if (g[v][1]+w<f[i][1])
g[i][0]=max(g[i][0], g[v][1]+w)

3) 最重要的数组:
son[i] 以i为根的子树,是哪个儿子给i最大贡献


第二步. O(n)

怎么更新up数组?
up[root]=0
父推子,假设i是u的孩子,i-u直接相连的边权值为w

分情况,u往上走,u往下走
1) up[i]=max(w+up[u], up[i])

u往下走的最远距离,是不是i往上能走到的?那不就是最远距离了吗,但是要注意u走过的路径不能和i重叠,不然i就变成往下走了,所以如果重叠,换次长路,这是肯定不会经过i
2) if (son[u]==i) up[i]=max(up[i], w+g[u][0])
else up[i]=max(up[i], w+g[u][1])


第三步

f[i]=max(g[i][1], up[i])
ans=max(ans, f[i])

 

 

 

 

标签:结点,子树,max,up,数组,整棵树,换根,dp
From: https://www.cnblogs.com/didiao233/p/18364160

相关文章

  • TCP/UDP网络聊天室
        本博客仅对网络聊天室项目进行分享,仅供学习讨论使用,欢迎大家讨论。UDP网络聊天室项目要求        利用UDP协议,实现一套聊天室软件。服务器端记录客户端的地址,客户端发送消息后,服务器群发给各个客户端软件,服务器也可以自己发送通知给所有客户端。  ......
  • 【网络】UDP回显服务器和客户端的构造,以及连接流程
    回显服务器(EchoServer)最简单的客户端服务器程序,不涉及到业务流程,只是对与API的用法做演示客户端发送什么样的请求,服务器就返回什么样的响应,没有任何业务逻辑,没有进行任何计算或者处理0.构造方法网络编程必须要使用网卡,就需要用到Socket对象创建一个DatagramS......
  • 巨大的数(dp+矩阵加速)
    第3题   巨大的数 查看测评数据信息小明定义了一种生成大数的函数f[n],他的含义是将1-n所有的正整数按照从小到大拼接起来,形成一个巨大的数,例如f[13]=12345678910111213,现在给定一个数n,输出f[n]%m的值,其中n和m都是正整数输入格式 第一行两个整数n,m部分数据:1<=n<=......
  • 抛硬币(概率dp)
    https://www.luogu.com.cn/problem/AT_dp_i第1题   抛硬币 查看测评数据信息有n个质地不均匀的硬币,抛第i枚硬币器正面朝上的概率是p[i],反面朝上的概率是1-p[i],扔完n个硬币后,求正面朝上的个数大于反面朝上的概率是多少。结果保留三位小数输入格式 第一行一个整数n,......
  • 第六章 网络互连与互联网(五):TCP 和 UDP 协议
    五、TCP和UDP协议在TCP/IP协议簇中有两个传输协议,即传输控制协议(TCP)和用户数据报协议(UDP)。TCP是面向连接的,而UDP是无连接的。1、TCP服务(1)TCP协议提供面向连接的、可靠的传输服务,适用于各种可靠的或不可靠的网络。(2)TCP用户送来的是字节流形式的数据,这些数据缓存......
  • 力扣 | 一维简单线性dp | 2140. 解决智力问题、322. 零钱兑换、2466. 统计构造好字符
    文章目录一、2140.解决智力问题二、322.零钱兑换三、2466.统计构造好字符串的方案数四、91.解码方法五、983.最低票价六、790.多米诺和托米诺平铺需要特别注意的题目有2140.解决智力问题和983.最低票价,因为这两个题目可以启发思路,其他的题都比较普通。一、21......
  • Python 通过UDP传输超过64k的信息
    在UDP中,单个数据包的最大尺寸通常受到网络层的限制,这通常被称为最大传输单元(MTU)。在以太网环境中,标准的MTU大小通常为1500字节。尽管有些网络环境可能支持更大的数据包,但是UDP数据包的理论最大限制是65535字节(64KB),这是由于UDP头部的16位长度字段决定的。然而,如果你需要发送超过这......
  • P4290 [HAOI2008] 玩具取名(区间dp,传递闭包?)
    link有点传递闭包的思想感觉这题(无聊倒装首先为了便于处理,将W,I,N,G映射为1,2,3,4那么处理数据,想到可以用传递闭包的思想?感觉差不多,因为这道题有很多一一对应的关系对于每次输入对应的两个字符\(ab\),定义\(g[a,b,i]\in\{0,1\}\)表示对应关系题目要求给定一个串\(s\)......
  • 初识DPDK
    DPDK是dataplanedevelopmekit的缩写,是一个c语言编写的软件开发框架,常用于高性能网络的开发。它的主要功能就是让用户绕过linux内核协议栈,将网卡收到的数据包直接在用户态空间内使用用户自定义的逻辑去处理数据包,或者将用户态空间的数据包绕过一系列的内核协议栈封装直接从网卡......
  • 2024.8.14 DP Round 2
    A.storeStatement:有\(n(1\len\le100)\)个果盘,其中第\(i\)个果盘有\(a_i\)个水果,容量是\(b_i(a_i\leb_i\le100)\)。一次操作可以将一个水果从一个果盘放到另一个果盘中,现在要将所有水果放到最少的盘子中,问最少要用多少盘子以及最少需要多少操作。Solution:第一......