动态规划——树形DP
树形DP
lllllan.
盛意以江河,江河不及你
展开
-
HDU 5834 Magic boy Bi Luo with his excited tree【树形DP⭐】
Magic boy Bi Luo with his excited tree题意: 在一棵既有边权又有点权的(无向)树上,要求求从每个节点出发能获得的最大权值。每经过某条边,都要花费相对应的边权。重复经过将重复花费。到达某个点,可以获得相对应的点权。只能获得一次。题解:题目中强调边权重复花费的时候就应该明白一点,为了得到最大权值,是需要走多条路才会走某些路往返走了两遍。一、什么路可能会走多遍?某条支路,走过去走回来,获得点权,扣去两次边权,仍有收益。二、什么路需要走多...原创 2021-02-18 14:08:35 · 125 阅读 · 0 评论 -
POJ 3162 Walking Race【树形DP + 线段树】
Walking Race题意: 题意大致是,nnn天,第iii天点iii出发,跑到距离iii点最远的点,记录距离。求最大的连续天数,使得其中的最大距离−最小距离<m最大距离-最小距离<m最大距离−最小距离<m题解: 树形DP求解每个点的最远距离,然后线段树求区间最大最小值即可。#include<iostream>#include<algorithm>#include<cstring>#include<cmath>u...原创 2021-02-16 12:27:14 · 165 阅读 · 0 评论 -
POJ 3140 Contestants Division【树形DP】
Contestants Division题意: 一棵有点权的树,求删除某条边之后,两棵子树的权值差最小。题解: 虽然题目没有很直白地说是一棵树 但是由题意可得确实是一棵树。随便找一点开始DFS,记录以每个节点为根的子树的权值和dp[i]。然后找到最小的sum - dp[i] - dp[i]即可。#include<iostream>#include<algorithm>#include<cstring>#include<cmath>u...原创 2021-02-15 17:42:33 · 85 阅读 · 0 评论 -
POJ 2378 Tree Cutting【树的重心】
Tree Cutting题意: 求树的重心。题解: 模板题,略。#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int maxn = 1e4 + 10;int n;int sz[maxn];int dp[maxn];vector<int> out;int cnt,...原创 2021-02-15 16:51:23 · 123 阅读 · 0 评论 -
POJ 3107 Godfather【树的重心】
Godfather题意: 求树的重心。题解:sz[i]记录以节点i为根节点的子树的节点个数dp[i]记录以连接节点i的节点为根节点的子树的节点个数dp最小的就是重心#include<iostream>#include<algorithm>using namespace std;const int maxn = 5e4 + 10;int n;int sz[maxn];int dp[maxn];int cnt, head[maxn];st...原创 2021-02-15 16:22:50 · 108 阅读 · 0 评论 -
CodeForces 219D Choosing Capital for Treeland【树形DP】
D. Choosing Capital for Treeland题意: 一棵有向边的树,找到一点,使得从这个点出发到所有的节点的逆边最少。求最小逆边个数和所有最小逆边的根节点。题解:虽然题意是有向边,但还是得建无向边。但是需要附上权值,正边权值为0,逆边权值为1。【权值反过来也无所谓】清楚一个地推关系。如果两个节点是u−>vu->vu−>v的关系,并且以u为根节点有xxx条逆边,那么以v为根节点则应该有x+1x+1x+1条逆边。反之,如果两个节点是u−>vu...原创 2021-02-15 11:30:06 · 127 阅读 · 0 评论 -
HDU 3721 Building Roads【树的中心 + 树形DP】
Building Roads题意: 移动一条边,求最小的树的直径。题解: 枚举每一条边,求删除改变之后的两棵树A、B。答案无外乎三种情况:直径完全在树A中直径完全在树B中直径贯穿了两棵树【对于这种,求出两棵树的中心,连接两树的中心,直径自然穿过】#include<bits/stdc++.h>using namespace std;const int maxn = 3e3 + 10;const int inf = 0x3f3f3f3f;int _T, n;...原创 2021-02-10 20:26:22 · 142 阅读 · 0 评论 -
树形DP
引入 顾名思义,树形DP就是指在“树”上进行的DP:给出一棵树,要求以最少的代价或取得最大的收益完成给定的操作。而用DP的意义在于,通常这类题目的规模较大,枚举的效率比较低,贪心不能得到最优解,因此用到DP。 比如hdu1520这道题目。 一棵有根树每个节点上有一个权值,相邻的父节点和子节点只能选择一个,问如何选择使得总权值之和最大(邀请员工参加宴会,为了避免员工和直属上司发生尴尬,规定员工和直属上司不能同时出席)。 输入:节点编号从1到N。第一行是数字N,1≤N≤6000.后续N行中的每原创 2020-08-08 23:11:40 · 157 阅读 · 0 评论 -
HDU 2196 Computer——树形DP
点这里题意: 一棵树有根树,根节点的编号是1,对其中的任意一个节点,求离他最远的节点的距离。复杂度分析: 如果求从一个特点节点出发的最长路径,可以从这个节点出发,做一次BFS,每次扩展邻居节点,并记录到这个邻居节点的最长距离,复杂度是O(n)。求所有n个节点的最长距离,需要对每个节点单独做一次BFS,总复杂度为O(n2).但是由于题目规模较大,N≤10000,所以算法的复杂度最多只能是O(nlog2n\log_2 nlog2n)。如图,以节点4为例,它的最长距离分两种情况讨论:以4为原创 2020-08-18 12:31:35 · 181 阅读 · 0 评论 -
HDU4126 Genghis Khan the Conqueror——最小生成树+树形DP(⭐)
点这里题意: 给定一个带权无向图G,n个点m条边,每条边都有一个权值w。题目保证两个点之间最多只有一条边。接下来有Q次边权的改变,且改变后的权值之后一定比原来的更大。求每次改变边权之后的所有最小生成树的平均值(边权的改变前后不影响。题解:构造最小生成树: 在没有任何边权改变之前,求出最原始的最小生成树,记录这棵树的权值和ans。边权替换: 再次强调,每次边权的改变,是独立操作、前后互补影响的。明确之后再对改变的边权进行分类讨论:边在树上: 这次改变的边在最原始的最小生成树上,并...原创 2020-09-05 14:36:17 · 154 阅读 · 0 评论