树形DP
untilyouydc
月份未到你也得接受
展开
-
treecnt 51Nod - 1677
给定一棵n个节点的树,从1到n标号。选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少。现需要计算对于所有选择k个点的情况最小选择边数的总和为多少。样例解释: 一共有三种可能:(下列配图蓝色点表示选择的点,红色边表示最优方案中的边)选择点{1,2}:至少要选择第一条边使得1和2联通。 选择点{1,3}:至少要选择第二条边使得1和3联通。...原创 2018-07-29 21:53:04 · 369 阅读 · 0 评论 -
Information Disturbing HDU - 3586(树形dp+二分)
题意:给出n个士兵,其中1号为指挥官,关系为树状结构,叶子为先锋,现在要在总花费小于m的情况切断所有的先锋与指挥官的联系,问最大的限制最小为多少思路:问最大限制最小,必然是二分答案。考虑dp,设dp[i]表示切断以i为根的子树与i的联系的最小费用,dp[i]=min(dp[i_son],w)(两种选择,要么去切断子节点的子树,要么切断i与子节点的联系)因为可能多次memset,所以...原创 2018-08-02 19:57:32 · 209 阅读 · 0 评论 -
The Ghost Blows Light HDU - 4276(树形dp+背包+最短路)
题意:就是有一棵树,每个节点有财宝,每条边有花费时间,限定时间T内,从1出发,最后要到N,问最多拿到的财宝是多少。思路:先从1到n跑一遍最短路,同时把最短路径的权重都变成0,在跑一次树上背包即可代码:#include <iostream>#include <stdio.h>#include <string.h>#include <alg...原创 2018-08-02 23:04:44 · 202 阅读 · 0 评论 -
Tree HDU - 3534 (树形dp)
题意:求树上最长路径和这样的路径数目思路:题目的难点在于统计数目,所以我们需要换一种dp思路,dp[i]表示以i为根的子树上的最长路(这样的最长路必定是通过i节点的),我们再去求所有节点的最大值就是要求的最大值了。在研究如何统计数量,我们可以设node[u]表示在以u为根的子树上最长路的数量,那么node[u]=node[v](或者node[u]=node[u]+node[v])。代码...原创 2018-08-03 13:09:41 · 226 阅读 · 0 评论 -
Road Projects CodeForces - 1016F (树形dp)
There are nn cities in the country of Berland. Some of them are connected by bidirectional roads in such a way that there exists exactly one path, which visits each road no more than once, between eve...原创 2018-08-30 21:05:57 · 309 阅读 · 0 评论 -
Rebuilding Roads POJ - 1947 (树形dp+背包)
思路dp[i][j]表示以i为根节点剩下j个节点的最少切割次数,将每个点都当成根节点看待,最后只有加上他和父亲节点相连的边+1就行了。 dp[i][1]必然是等于i的子节点数量。代码#pragma comment(linker, "/STACK:1024000000,1024000000") //加栈#include <iostream>#include <...原创 2018-09-13 11:26:20 · 176 阅读 · 0 评论 -
Apple Tree POJ - 2486(三维 树形背包)
思路首先可以想到dp[i][j]表示在i节点可以走j步获得的最大值,其实就是类似于将j步分给它的子节点,树上背包问题。 但是这题还有一个要点,那就是当你分配给子节点一些步数后,可能还会回到i节点,所以需要考虑到底回不回i节点的问题,解决方法就是多加一维记录是否回到i节点。 dp[i][j][0]表示不回,dp[i][j][1]表示回到i节点。 如果要回到i节点,那么就必须多留出2步,如果...原创 2018-09-13 12:55:50 · 338 阅读 · 0 评论 -
Contestants Division POJ - 3140 (简单树形dp)
#pragma comment(linker, "/STACK:1024000000,1024000000") //加栈#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <..原创 2018-09-13 15:48:08 · 169 阅读 · 0 评论 -
Tree Cutting HDU - 5909 (树形dp + 树分治)
思路:第二道树分治题,但这题首先要先解决dp的递推表达式。首先先确定一点,同一子树上的dfs序一定是连续的,这也就给了我们一个将树上的dp映射到普通dp上(普通dp我们研究的元素之间通常是连续的)。换句话说,按dfs序的话,我们就可以考虑前i项构成的子树这样的情况,如果不是dfs序,那么前i项可能在不同子树,这与题目要求不符。设dp[i][j]表示考虑了dfs序的前i项,目前连通块的异或和...原创 2018-09-30 23:57:19 · 300 阅读 · 0 评论 -
GeoDefense HDU - 4044 (树行dp+背包)
题意:这是一个塔防游戏,地图是一个n个编号为1~n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地。敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基地,你可以选择造塔。每个节点最多只能造一个塔,且节点i可以有ki种塔供你选择,价钱和攻击力分别为price_i, power_i,攻击力power_i,效果是让敌人经过这个节点时让敌人的血减少power_i点。那么从敌人的基地到你的...原创 2018-08-02 17:00:49 · 161 阅读 · 0 评论 -
Find Metal Mineral HDU - 4003 (树行dp+分组背包)
Humans have discovered a kind of new metal mineral on Mars which are distributed in point‐like with paths connecting each of them which formed a tree. Now Humans launches k robots on Mars to collect t...原创 2018-08-02 14:20:09 · 185 阅读 · 0 评论 -
Y HDU - 4705
#pragma comment(linker, "/STACK:1024000000,1024000000") //加栈#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include &l..原创 2018-08-06 22:00:08 · 234 阅读 · 0 评论 -
Terrorist’s destroy HDU - 4679(树形dp+树的直径的应用)
题意:(题意来源 https://blog.csdn.net/ayecsz/article/details/10046759)给你一棵树和边上的权值,定义去掉一条边的花费为边权值(a)乘上b,b定义为去掉边后形成的两棵树中两点间的最远距离(注意是各自内部的最远距离),问去掉哪条边的花费最少?分析:首先我们可以将树的直径找出来,如下图假设1->6就是这棵树的直径,非直径上的边为...原创 2018-08-03 21:37:32 · 330 阅读 · 0 评论 -
Strategic Game HDU - 1054 (树形dp)
题意:求一棵树上的最小点覆盖思路:可以二分图来做,但是据说很慢,dp思路:和 Anniversary party HDU - 1520 的做法很像,因为每个节点只有放于不放两种操作,dp[i][0]表示不放,dp[i][1]表示放,状态转移:dp[i][0]+=dp[son][1],dp[i][1]+=min(dp[son][1],dp[son][0])代码:#pragma ...原创 2018-08-04 10:09:00 · 208 阅读 · 0 评论 -
Bob’s Race HDU - 4123 (树形DP+RMQ+区间队列)
Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses, and all houses ar...原创 2018-08-05 21:58:53 · 441 阅读 · 0 评论 -
Tree2cycle HDU - 4714 (树形dp)
A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 unit of cost respectively. The nodes are labeled from 1 to N. Your job is to transform the tree to a cycle(with...原创 2018-08-05 23:12:01 · 225 阅读 · 0 评论 -
Balancing Act POJ - 1655(求树的重心)
思路1:统计每个点的子树有多少个节点,同时记录子节点的子树中,有节点数量最多的子树,dp即可dp[i]表示以节点i为根的子树有多少节点,f[i]表示以i为根的子树中,最多的节点分支数思路2:之前写过一次,现在学点分治又重新写了一次,现在写的比以前快了很多,树的重心定义为:以它为根结点,它的子树的节点数目最大值最小。利用size[u]记录以它为根的子树的节点数量,dp[u]记录子树的...原创 2018-08-05 23:42:05 · 219 阅读 · 0 评论 -
The more, The Better HDU - 1561 (转化为树行01背包)
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200...原创 2018-08-06 10:53:10 · 180 阅读 · 0 评论 -
树形dp小结1
常见问题:1. 父亲节点与子节点有相互制约(只能选其一),或者是相互共存(要选子节点就必须选父亲节点),其实这两种问题都属于背包模型里的依赖型背包。解决这两类问题首先要确定父亲节点和子节点的关系,加入选了父亲节点就不能选子节点,那么在dp的时候,就要分两种情况来讨论,每个节点选还是不选,一般需要开一个二位数组dp[i][0],dp[i][1]分别代表这个节点选或是不选。例题分析: Anni...原创 2018-08-06 15:44:33 · 1277 阅读 · 0 评论 -
Computer HDU - 2196
A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Ma...原创 2018-08-01 23:31:49 · 208 阅读 · 1 评论 -
Fire POJ - 2152 (树形dp)
题意:给你一颗树,每个点都有一个w值,代表在这个点修建工程需要花费w,还有一个d值,代表离这个点距离小于d的点可以作为这个点的建立工程的点。每条边都有权重,求出覆盖所有点的最小花费。思路:首先分析,是否具有最优子结构性质,发现任意一颗子树的最小值,都满足最优子结构。考虑动态规划的做法。这个题的难点在于可以选一个点来覆盖其他点,所以我们的一个想法必然是枚举这个被选取的点。设dp[u][j...原创 2018-10-20 09:42:38 · 388 阅读 · 0 评论