【洛谷P1272】 重建道路
重建道路
一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树。John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。
显然是一道树形DP
然后看题解
树上分组背包问题
dp[u][i][j]表示以u为根的子树中,前i个子树中留下j个的最小花费
首先,dp[u][size[u]][1]=son_num[u]
以u为节点的子树留下1个节点的花费为u的子树个数
dp[u][i][j]=min(dp[u][i][j],dp[u][i-1][j-k]+dp[v][size[v]][k]-1);
i这一维可以滚动数组滚掉
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #define N 155
- int n,p,dp[N][N],out[N],in[N];
- struct NODE{
- int to,next;
- } e[N];
- int Head[N],num;
- inline void add(int x,int y){
- e[++num].to=y;
- e[num].next=Head[x];
- Head[x]=num;
- }
- inline int read(){
- int x=; char c=getchar();
- while(c<''||c>'') c=getchar();
- while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
- return x;
- }
- inline int min(int a,int b){
- return a<b?a:b;
- }
- int dfs(int u){
- dp[u][]=out[u];
- int sum=;
- for(int i=Head[u];i;i=e[i].next){
- int v=e[i].to;
- int sz=dfs(v); sum+=sz;
- for(int j=sum;j>=;j--)
- for(int k=;k<=min(sz,j);k++){
- dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]-);
- }
- }
- dp[u][sum]=;
- return sum;
- }
- int main()
- {
- memset(dp,0x3f,sizeof(dp));
- scanf("%d%d",&n,&p);
- int x,y;
- for(int i=;i<n;i++){
- x=read(); y=read();
- add(x,y);
- out[x]++; in[y]++;
- }
- int st;
- for(int i=;i<=n;i++)
- if(!in[i]) {
- st=i; break;
- }
- dfs(st);
- int ans=0x7fffffff;
- for(int i=;i<=n;i++)
- ans=min(ans,dp[i][p]+(i==st?:));
- printf("%d\n",ans);
- return ;
- }
【洛谷P1272】 重建道路的更多相关文章
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 P1272 重建道路(树形DP)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- [洛谷P1272] 重建道路
类型:树形背包 传送门:>Here< 题意:给出一棵树,要求断开$k$条边来分离出一棵有$P$个节点的子树.求最小的$k$ 解题思路 和上一题类型相同,但不那么好做了——分离出的一棵子树肯 ...
- 洛谷 P1272 重建道路
题目链接 题解 树形dp \(f_{i, j}\)表示以\(i\)为根的子树切出联通块大小为\(j\)的最小答案 显然\(f[i][1]\)为与\(i\)连的边数 设\(v\)是\(u\)的儿子 那么 ...
- 【洛谷P1272】道路重建
题目大意:给定一个 N 个节点的树,求至少剪掉多少条边才能使得从树中分离出一个大小为 M 的子树. 题解:考虑树形 dp,定义 \(dp[u][i][t]\) 为以 u 为根节点与前 i 个子节点构成 ...
- 洛谷 P1272 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- P1272 重建道路(树形dp)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- P1272 重建道路
题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...
随机推荐
- Unable to connect to data source (DSN: shangjihuiclient; Network Address: ; Port Number: 53397). Cannot connect to TimesTen Server. Verify that the TimesTen Server is running or verify that your TCP PORT is set correctly.
安装完毕TimesTen后,在客户端连接时一直报错. 解决办法是:重启服务器,在连接没在报这个错误.
- Kettle集群部署(1台Windows主机和2台Linux服务器)
不多说,直接上干货! http://blog.csdn.net/jianglushou9763/article/details/70859616
- adb调试安卓
http://blog.csdn.net/liushida00/article/details/49797239
- Hadoop 2.7.2 集群搭建(转载)
http://blog.csdn.net/u010048823/article/details/51913608
- 【Linux】快速清空当前文件
$ : > filename $ > filename $ echo "" > filename $ echo > filename $ cat /dev/ ...
- css三角块
html: <div class="angle"></div> css: .angle{ width: 0px; height: 0px; border-b ...
- phpstorm主题设置
毫无疑问,phpstorm很好用,但是安装完成后自带的主题,丑的一匹,所以总结下如何更换主题............. 1.主题下载位置 http://www.phpstorm-themes.com ...
- centos7 安装jdk、Tomcat
1.安装jdk 下载jdk: 解压:tar -zxvf filename -C /usr/local/jdk8/ 配置环境变量: vim /etc/profile 添加如下内容:JAVA_HOME根据 ...
- union、except和intersect查询
1. union联合查询 (合并) select r.room_id from room r union select rp.num from room_type rp 要求表1和表2的查询结果结构 ...
- MVC Request.UrlReferrer为null
使用情景,登录后返回登录前访问的页面. 这个时候用到了UrlReferrer var returnUrl = HttpContext.Current.Request.UrlReferrer != nu ...