【USACO02FEB】Rebuilding Roads 重建道路 题解(树形DP)
题目大意:问使含有$p$个节点的子树分离至少需要去掉几条边。
------------------
设$f[i][j]$表示以$i$为根的子树保留$j$个节点所去掉的最少边数。
初始化$f[u][1]=c[u]$。$c[u]$是这个节点的度。
转移方程$f[u][j]=min(f[u][j],f[u][k]+f[v][j-k]-2)$。为什么要减$2$?这是因为我们在初始化的时候已经把连接父节点和子节点的这条边去掉了。这时候再把他们连起来,为防止重复计算,我们分别把$u->v$和$v->u$的边去掉(代码中是双向连边)。
代码:
//f[u][j]min(f[u][j],f[u][k]+f[v][j-k]-2)
//-2:now->to to->now 减去重复的边 初始化的时候已经减掉了
#include<bits/stdc++.h>
using namespace std;
int c[],n,p,f[][],ans=0x3f3f3f3f;
struct node
{
int next,to;
}edge[];
int head[],cnt;
inline void add(int from,int to)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void dfs(int now,int fa)
{
f[now][]=c[now];
for (int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
if (to!=fa)
{
dfs(to,now);
for (int j=p;j>=;j--)
for (int k=;k<j;k++)
f[now][j]=min(f[now][j],f[now][k]+f[to][j-k]-);
}
}
}
int main()
{
memset(f,0x3f,sizeof(f));
n=read(),p=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
c[x]++;c[y]++;
add(x,y);add(y,x);
}
dfs(,);
for (int i=;i<=n;i++) ans=min(ans,f[i][p]);
printf("%d",ans);
return ;
}
【USACO02FEB】Rebuilding Roads 重建道路 题解(树形DP)的更多相关文章
- [Usaco2002 Feb]Rebuilding Roads重建道路
题目描述 一场可怕的地震后,奶牛用N个牲口棚(1 <= N <= 150,编号1..N)重建了农民John的牧场.奶牛没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一 ...
- Codeforces 835 F Roads in the Kingdom(树形dp)
F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...
- 【bzoj2435】[NOI2011]道路修建 树形dp
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
- [luogu2052 NOI2011] 道路修建 (树形dp)
传送门 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- [noi2011]道路修建 树形dp
这道题可以说是树形dp的入门题,也可以看成是一道检验[树]这个数据结构的题目: 这道题只能bfs,毕竟10^6的复杂度win下肯定爆栈了: 但是最恶心的还不是这个,实测用printf输出 用cout输 ...
- Codeforces 671D. Roads in Yusland(树形DP+线段树)
调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...
- 洛谷P2052 [NOI2011]道路修建(树形DP)
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...
- 洛谷4438 [Hnoi2018]道路 【树形dp】
题目 题目太长懒得打 题解 HNOI2018惊现普及+/提高? 由最长路径很短,设\(f[i][x][y]\)表示\(i\)号点到根有\(x\)条未修公路,\(y\)条未修铁路,子树所有乡村不便利值的 ...
随机推荐
- 新手用Python运行selenium的常见问题
1.更换Python版本 打开pycharm,点击 file——setting——project项目名——project Interpreter,点击右侧的设置,如下图 选择新Python版本的安装路 ...
- 题解:2018级算法第一次上机 C1-pair
题目描述 北航2018级软件学院算法分析与设计第一次上机第三题 样例 实现解释 题目类型: 这类题目其实就是典型的递归分析语句形式的问题,也是编译原理课程中语法分析的重要方法之一. 解决方案: 为了解 ...
- 机器学习03 /jieba详解
机器学习03 /jieba详解 目录 机器学习03 /jieba详解 1.引言 2.分词 2.1.jieba.cut && jieba.cut_for_search 2.2.jieba ...
- 从零搭建Spring Cloud Gateway网关(三)——报文结构转换
背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...
- bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*
bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 题意: RMQ问题.序列长度≤25000,问题数≤25000. 题解: 倍增. 代码: #include < ...
- 为什么SpringBoot项目里引入其他依赖不要写版本号
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> < ...
- 享元模式(c++实现)
享元模式 目录 享元模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象. 模式动机 如果一个应用使用了大量的对 ...
- scratch编程我的世界3D史蒂夫
这个程序我们只能制作出一个3D模型而已,并不是真正的我的世界整个游戏: 效果很炫酷吧!现在我们就来看看是怎样编程的吧! 首先,这个模型是有无数个平面克隆体摞在一起,旋转后会产生一种立体的错觉,是不是有 ...
- 7.CSMA协议
载波监听多路访问协议CSMA CS:载波侦听/监听,每一个站在发送数据之前要检测一下总线上是否有其他计算机在发送数据. MA:多点接入,表示许多计算机以多点接入的方式连接在一根总线上 协议思想:发送帧 ...
- canvas学习01
canvas 必须指定宽高,确定可绘图区域的大小 canvas标签里写的是浏览器不支持canvas时展示的内容 <canvas id="drawing" width=&quo ...