洛谷 P1272 重建道路(树形DP)】的更多相关文章

P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系统可以被构建成一棵树.John想要知道另一次地震会造成多严重的破坏.有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目. 输入输出格式 输入格式: 第1行:2个整数,N和P 第2..N行:每行2个整数I和J,表示…
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系统可以被构建成一棵树.\(John\)想要知道另一次地震会造成多严重的破坏.有些道路一旦被毁坏,就会使一棵含有\(P(1≤P≤N)\)个牲口棚的子树和剩余的牲口棚分离,\(John\)想知道这些道路的最小数目. 输入输出格式 输入格式: 第1行:…
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系统可以被构建成一棵树.John想要知道另一次地震会造成多严重的破坏.有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目. 输入输出格式 输入格式: 第1行:2个整数,N和P 第2..N行:每行2个整数I和J,表示…
题目链接 题解 树形dp \(f_{i, j}\)表示以\(i\)为根的子树切出联通块大小为\(j\)的最小答案 显然\(f[i][1]\)为与\(i\)连的边数 设\(v\)是\(u\)的儿子 那么有\(f[u][i]=f[u][i-j]+f[v][j]-2\),因为\(u->v\)这条边算了两次 注意\(i\)要从大到小枚举 Code #include<bits/stdc++.h> #define LL long long #define RG register using name…
类型:树形背包 传送门:>Here< 题意:给出一棵树,要求断开$k$条边来分离出一棵有$P$个节点的子树.求最小的$k$ 解题思路 和上一题类型相同,但不那么好做了——分离出的一棵子树肯定是在一起的,不能是散的,因此这给dp带来了难度 $dp[u][i][j]$表示节点$u$的子树内,在前$i$棵子树内分离出有$j$个节点的子树,最少断的边.特别需要注意的是,这里的有$j$个节点的子树必须包含节点$u$ 想到这个定义以后就不难了,有方程$$dp[u][i][j]=Min\{dp[u][i-1…
刚才瞅了半天自己当初写的,终于瞅出来了...QWQ 设f[i][j]表示以i为根的子树,包含j个节点所需砍掉的最小边数 那么可知f[u][1]=u的度: 方程:f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]-2); 为何减2? 因为你已经默认了把与自己相连的所有边都去掉了,于是相当于多去了边(u,v)两次,所以要-2 #include<cstdio> #include<iostream> #include<algorithm> #includ…
重建道路 树形DP 给一棵树,问最少断多少边使得这棵树树最终只有\(p​\)个节点 设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离\(u\)最少需要断的边数.类比背包,容易得到转移方程: \[ f[u][i][j]=min{f[u][i-1][j-k]+f[v][n][k]} \] 再优化一维\(i\),状态变为\(f[u][j]\),此时必须倒序遍历\(j\). 需要注意的是,最后答案并不是\(f[1][sz[1]-p]\)…
题目大意:给定一个 N 个节点的树,求至少剪掉多少条边才能使得从树中分离出一个大小为 M 的子树. 题解:考虑树形 dp,定义 \(dp[u][i][t]\) 为以 u 为根节点与前 i 个子节点构成的子树中,保留 t 个节点(包括根节点)的最小代价,则状态转移方程为 \(dp[u][i][t]=min(dp[u][i][t],dp[u][i-1][t-k]+dp[v][son(v)][k]-2)\),在这里之所以减掉 2,是因为在前 i-1 个子节点与 u 构成的子树中,必然不包括第 i 个子…
洛谷 2014 选课 没学树形DP的,看一下. 首先要学会多叉树转二叉树. 树有很多种,二叉树是一种人人喜欢的数据结构,简单而且规则.但一般来说,树形动规的题目很少出现二叉树,因此将多叉树转成二叉树就是一种必备的手段,方法非常简单,“左儿子,右兄弟” .就是将一个节点的第一个儿子放在左儿子的位置,下一个儿子,即左儿子的第一个兄弟,放在左儿子的右儿子位置上,再下一个兄弟接着放在右儿子的右儿子,以此类推. 代码: scanf("%d%d",&u,&v) //v的父亲是u )…
洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数目的士兵,使得这些士兵能够瞭望到所有的路. 注意:某个士兵在一个节点上时,与该节点相连的所有边都将能被瞭望到. 请你编一个程序,给定一棵树,帮 Bob 计算出他最少要放置的士兵数. Sol 状态: f[i][0]表示i不放士兵时,以i为根的子树所需要的最小士兵数 f[i][1]表示i放士兵时,以i为…