随笔分类 -  树上操作

摘要:1.Huffman Tree(哈弗曼树) 1.1首先存在定义: 树的带权路径长度:树中所有叶节点的权值乘上其到根的路径长度之和 构造一棵二叉树使其带权路径长度最小,称这样的二叉树为哈夫曼树。也叫最优二叉树 1.2 性质1:哈弗曼树是一颗满二叉树: 证明:如果不是满二叉树,我们就把儿子数为1的节点变为 阅读全文
posted @ 2019-11-10 15:31 神之右大臣 阅读(474) 评论(0) 推荐(0)
摘要:题面 总体来说是一道从下往上的DP+贪心; 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间; 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可以证明,这样的答案一定是最优的; 然后f[i]=max(f[i],f[j]+cnt); 总的时间复杂 阅读全文
posted @ 2019-11-06 20:11 神之右大臣 阅读(236) 评论(0) 推荐(0)
摘要:题面 对于每个点,我们可以用一次dfs求出这个点到以这个点为字树的最远距离和次远距离; 然后用换根法再来一遍dfs求出这个点到除这个点子树之外的最远距离; 显然的,每次的询问我们可以用向上的最大值加向下的最大值得到; 具体换根法的实现可以看下面的代码~; #include <bits/stdc++. 阅读全文
posted @ 2019-11-06 17:29 神之右大臣 阅读(214) 评论(0) 推荐(0)
摘要:T1.[LNOI2014]LCA 给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。 有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z 阅读全文
posted @ 2019-11-05 19:44 神之右大臣 阅读(186) 评论(0) 推荐(1)
摘要:题面 这道题明显的一定要找到直径的具体路径,所以两遍dfs是比较好的选择; 第一问是一道弱智题吧? 主要难度全部分摊在了第二问; 其实不难,先找到任意一个直径; 对于任意一个在直径上的点: 设nxt[i]表示这个点的下一个位置,pre[i]表示这个点的上一个位置; ls[i]表示这个点到直径的左端点 阅读全文
posted @ 2019-11-05 16:03 神之右大臣 阅读(189) 评论(0) 推荐(0)
摘要:题面 这道题比较显然地,是一道树形背包; 但是会有环,怎么办呢? 缩点!tarjan缩点! 然后在新图上跑树形背包就可以AC了 #include <bits/stdc++.h> #define inc(i,a,b) for(register int i=a;i<=b;i++) using names 阅读全文
posted @ 2019-11-03 19:58 神之右大臣 阅读(204) 评论(0) 推荐(0)
摘要:题面 这道题由于问最大值最小,所以很容易想到二分,但怎么验证并且如何实现是这道题的难点; 首先我们考虑,对于一个军队,尽可能的往根节点走(但一定不到)是最优的; 判断一个军队最远走到哪可以树上倍增来实现; 但是,这并没有结束,因为可能这颗子树的军队会去另一个军队; 我们先找出所有以根节点的子节点为根 阅读全文
posted @ 2019-10-25 19:30 神之右大臣 阅读(230) 评论(0) 推荐(0)
摘要:一棵树,如果有序点对(x,y)之间路径的长度取模于3==0,那么ans0便加上这个长度; 如果取模于3==1,那么ans1便加上这个长度; 如果取模于3==2,那么ans2便加上这个长度; 让你求ans0,ans1,ans2; 输入格式: 第一行包括一个整数n,表示一共有n个点 下面n-1行,每一行 阅读全文
posted @ 2019-10-22 20:55 神之右大臣 阅读(176) 评论(0) 推荐(0)
摘要:题面 目的:求出树的各边长度 条件:每个节点之间最短路、整个图中不存在负边 我们可以每一次把一个点加入树内,求出这个点和已经构建好的树的边的长度; 这个长度抽象理解一下就是(dis[i][j]+dis[i][root]-dis[root][j])/2 为什么?因为上面的式子中这条边刚好遍历了两次; 阅读全文
posted @ 2019-10-15 10:05 神之右大臣 阅读(158) 评论(0) 推荐(0)
摘要:题面 这道题稍微想一想就会联想到树形DP的入门题:没有上司的舞会; 但是再想一想会发现这根本就不是一颗树,因为它比树多了一条边; 这时候我们引入一个新的概念:基环树; 顾名思义(??),基环树就是在一颗树上填一条边构成的一个图;基环树也叫环套树(明明更像树套环)。 我们在树上可以做的事情基本都可以在 阅读全文
posted @ 2019-09-24 14:21 神之右大臣 阅读(149) 评论(0) 推荐(0)
摘要:题面 这道题是一道比较水的XXOI题; 我们可以发现,反着思考题目就变为了让所有叶子节点同时发出信号,然后这些信号同时到达根节点; 可以证明,这样答案不会改变; 那么我们可以自下而上dfs(),设f[u]表示以u为根,可以到达的最远距离; 那么很显然,对于点u,它对答案的贡献度就是num(它子节点的 阅读全文
posted @ 2019-09-23 15:45 神之右大臣 阅读(150) 评论(0) 推荐(0)
摘要:树的重心:对于一颗n个节点的无根树,找到一个点,使得把树变成以该节点为根的有根树时,最大子树的节点数最小,也就是说删除这个点后最大联通块的节点数最小其实求树的重心算是一个比较基础的树形dp。用dp[i]代表以i为根的子树的所有节点个数(包含i节点本身),如果要以i为重心的话,那么其最大子树的节点数就 阅读全文
posted @ 2019-07-30 14:07 神之右大臣 阅读(151) 评论(0) 推荐(0)
摘要:树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点之间的距离被称 为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径。 树形DP求树的直径(时间复杂度:O(n))设1号节点为根,"N个点N-1条边的无向图"就可以看做“有根树 阅读全文
posted @ 2019-07-29 21:02 神之右大臣 阅读(145) 评论(0) 推荐(0)