首页 > TAG信息列表 > 为根
判断是否为子节点/判断节点在是否在另一节点为根的子树中
如下题解中绿色三角形所示: 可以在一次DFS中,处理出节点的进出“时间”,这样,如果是有亲缘关系的节点,则会有时间上的包含关系。 时间用全局变量表示,进入DFS函数时记录进入时间,DFS完全部子树后,返回前,记录出时间。 https://www.bilibili.com/video/BV1pW4y1r7xs?spm_id_from=333.999.0.0VK Cup 2017 Round 3 - D. Perishable Roads(最短路:将问题性质挖掘到极致)
VK Cup 2017 - Round 3 - D. Perishable Roads 题目链接: 传送门: https://codeforces.com/contest/773/problem/D 题目大意: 对于每一个点\(i\in[1,n]\),求解以点\(i\)为根的生成树使得\(ans_i=\sum_{j=1}^nd(j)\)最小,其中\(d(j)\)为结点\(j\)到根\(i\)路径上的最小边权。输出\(ans_「联合省选 2020 A」树
「联合省选 2020 A」树 按位考虑。 对于一个点来说,其儿子到其的距离是 \(dep_v-u\)。 那么其儿子做出的贡献是 \(V_v+dep_v-dep_u\)。 在模 \(2^{i+1}\) 的意义下若 \(2_i\le V_v+dep_v-dep_u< 2^{i+1}\) 则 \(v\) 会对 \(u\) 产生一个 \(2^i\) 的贡献。 也就是说,我们求出以 \(u\)没有上司的舞会——树形dp
P1352 没有上司的舞会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 一道很好的树形dp入门题。 要明确树形dp主要的实现方式是dfs。 状态表示:f [ i , 0 ]表示以i为根的子树,i层不取值时的最大值。 f [ i , 1 ]表示以i为根的子树,i层取值时的最大值 状态计算:f [ i , 0CF1187E Tree Painting
前言 您完全可以略过这段。 校内模拟赛的时候一位大奆佬搬了这题。 然后我切了。 个人认为这题是一道不错的换根dp,虽然略显套路。 题意简述 给定一棵有 \(n\) 个结点的无根树,所有结点都是白色的。 第一次操作可以随意使一个结点染成黑色,之后每次操作可以使一个与黑色结点相邻的白树的重心
题目描述 给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。 输入格式 第一行包含整数n,表示Dsu on tree
dsu on tree学习笔记 (\(\uparrow\) 学习参考) 一般来说,Dsu on tree 大多可以和 点分治 互相换着用,都是处理子树或以 \(x\) 为根的路径等问题。 这种问题假设好状态基本上可以秒了。 咕咕咕AIM Tech Round 3 (Div. 1)]C.Centroids
AIM Tech Round 3 (Div. 1)C.Centroids 题意:题意:给一棵树,问树的每个点能不能通过仅一次删边加边变成质心,所谓质心即删掉该点和相邻的边剩下的每个联通块大小都小于等于n/2。n ≤ 400000 思路:树形dp+换根dp $umax[i]表示除了以点i为根的树,整颗大树的剩余部分中,结点数最多的子树的值手把手带你刷二叉树(第三期)
https://labuladong.gitee.io/algo/2/18/23/ 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 652.寻找重复的子树(中等) ———– 接前文 手把手带你刷二叉树(第一期) 和 手把手带你刷二叉树(第二期),本文继续来刷二叉树。 从前两篇文章的阅读量来看,大家还AVL平衡二叉查找树
AVL树:左旋与右旋 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL 旋转"。 假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失F.孤独(牛客小白月赛39)
F.孤独(牛客小白月赛39) 题意: 给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小 题解: 这题有点印象,感觉做过,至少这个方法肯定遇到过 设dp[u]表示以u为根的子树里,删除以u为起点的路径后最大连通块的大小最小是多少 我们贪心的去进行转换根DP
换根\(DP\)属于树形\(DP\),是二次扫描,因为这类问题通常不会指定根结点,并且根节点的变化会对一些值,例如子结点深度和、点权和等产生影响。 通常需要二次\(DFS\),第一次\(DFS\)来处理深度,以及点权和之类的问题,第二次\(DFS\)开始动态规划。 令\(u\)为当前结点,\(v\)为当前结点的叶子结点STDOJ pyf的树(树形dp)
题目 思路 首先我们需要两个数组: c n t cnt cnt 数组记录每一个节点的子节点个数【算法学习笔记】动态规划与数据结构的结合,在树上做DP
前置芝士:Here 本文是基于 OI wiki 上的文章加以修改完成,感谢社区的转载支持和其他方面的支持 树形 DP,即在树上进行的 DP。由于树固有的递归性质,树形 DP 一般都是递归进行的。 基础 以下面这道题为例,介绍一下树形 DP 的一般过程。 例题 洛谷 P1352 没有上司的舞会 题目描述 某树上染色
题面 树上染色 题解 这道题转移应该很容易。 直接枚举当前节点染黑的个数以及子节点染黑的个数即可。 设 \(f[x][j]\) 表示以 \(x\) 为根节点的子树中染黑 \(j\) 个点时两种颜色两两距离的之和的最大值。 所以有状态转移方程: \[f[x][j] = min(f[x][j - p] + f[y][p] + val) \]其中数据结构——堆(heap)
一、概念 说起堆,我们就想起了土堆,把土堆起来,当我们要用土的时候,首先用到最上面的土。类似地,堆其实是一种优先队列,按照某种优先级将数字“堆”起来,每次取得时候从堆顶取。 堆是一颗完全二叉树,其特点有如下几点: 1.可以使用一维数组来表示。其中,第i个节点的父节点、子节点index如[CF1172B] Nauuo and Circle
传送门 解答 随便找个根。 设\(f_u\)表示以\(u\)为根的子树的“圆排列”数,则通过枚举儿子的排列与它们的“圆排列”从何处“断开”,有: \[f_u = |son_u|!\prod_{v\in son_u}f_v(|son_v|+1) \]化简,得: \[ans = \prod_{u} deg_u! \]5.8考试总结
考试总结 \(T1\) 树 最关键的一个点在于\(2\)的爸爸只能是\(1\), 因此,可以把一棵树分为两部分: 以\(2\)为根节点 除去\(2\)及其子树还有\(1\)节点的那一部分 然后就可以在这两棵树之间愉快的反复横跳了\(QAQ\) 以 2 为根的子树中最深节点的深度比其它部分的要小 首先,这个其它部[长链剖分优化dp] Codeforces 1499F
题目大意 给定一棵 \(n(2\leq n\leq 5000)\) 个点的树,求一共有多少种方案,删去若干条边后,分裂出的所有树的直径都不超过 \(K\),答案模 \(998244353\)。 题解 设 \(dp[u][i]\) 表示把以 \(u\) 为根的子树分裂成若干棵直径不超过 \(K\) 的树,且以 \(u\) 为根的树的高度为 \(i\) 的方案CF1120D Power Tree(树形DP/构造+差分+最小生成树)
解法一:树形DP 个人觉得这个方法是比较可能想到的,但是输出方案很恶心 先转换题意:“无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独+1、-1 模拟一下就可以发现,以u为根的子树中, 要想通过控制Leetcode96. 不同的二叉搜索树
96. 不同的二叉搜索树 Difficulty: 中等 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2填坑行动6-树的重心
目录什么是树的重心树的重心的性质怎么求树的重心 什么是树的重心 对于一棵树无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小。换句话说,删除这个点后最大连通块(一定是树)的结点数最小。 树的重心不唯一。 树的重心的性质 树中所有点到某个点的距离和中,到舞会(lgP1352)
写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk 好吧其实是因为我记得上次做这题的时候写的是 bfs 设 \(f[i][0]\) 表示以 \(i\) 为根的子树当 \(i\) 不去时的最大搞笑值, \(f[i][1]\) 表示以 \(i\) 为根的子树当 \(i\) 去时的最大搞笑值。堆排序分析(大根堆为例,由小到大排序)
时间复杂度为O(nlogn),思路就是从最后一个非叶结点开始,依次往回遍历每个结点,将以该结点为根的子树建立成大根堆,直到遍历到整棵完全二叉树的根结点时为止,此时整棵树为大根堆。 以当前结点为根的子树建立大根堆: //向下调整,将该结点的子树变成大根堆 void AdjustDown(int A[],intBZOJ1123 BLO Tarjan
题目描述:一个国家有n个城镇,m条双向道路,n<=1e5,m<=5e5,没有自环和重边。所有城镇联通。现在你需要给出n个答案,第i个答案表示当你去掉结点i的所有关联边后,整个图上有多少个点对(u,v)满足u,v不连通? 思路:若某个结点u在图上不是割点的话,相当于只有u与其他结点断开了联系。所以答案为2*(