NOIP模拟 拆网线 - 贪心策略+dp
题目大意:
给一颗n个节点的树,保留最少的边,使得每个连通块的大小都大于等于2,并且连通块的点数和等于k.
题目分析:
要想留下的边数最少,就要尽量多的选择单独的边,这里就要贪心:尽可能多的选择单独的边。 如果选出的边*2大于等于了k,就直接根据k的奇偶返回答案。如果不够,就将剩下的点挂在每一条单链上。
明确思路,只要求出最多的单独的边问题就迎刃而解:dp[i][0]表示i节点不向儿子连边,其子树中最多的单独的边,dp[i][1]表示i节点向某一个儿子连边其子树中最多的单独的边。
\]
\]
code
#include<bits/stdc++.h>
using namespace std;
#define maxn 100050
namespace IO{
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
}
inline void wr(int x){
if(x < 0) x = -x, putchar('-');
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
}using namespace IO;
int T, n, k, dp[maxn][2];
vector<int> adj[maxn];
inline void DP(int x, int f){
// cout<<x<<"!!!";
int maxx = 0;
for(int i = adj[x].size() - 1; i >= 0; i--){
int v = adj[x][i];
if(v == f) continue;
DP(v, x);
dp[x][0] += dp[v][1];
maxx += dp[v][1];
}
for(int i = adj[x].size() - 1; i >= 0; i--){
int v = adj[x][i];
if(v == f) continue;
dp[x][1] = max(dp[x][1], maxx - dp[v][1] + dp[v][0] + 1);
}
// cout<<x<<" "<<dp[x][1]<<" "<<dp[x][0]<<endl;
}
int main(){
freopen("h.in", "r", stdin);
scanf("%d", &T);
while(T--){
for(int i = 1; i <= n; i++) adj[i].clear();
memset(dp, 0, sizeof dp);
n = read(), k = read();
for(int i = 1; i < n; i++){
int x = read();
adj[x].push_back(i + 1), adj[i + 1].push_back(x);
}
DP(1, 0);
// continue;
if(max(dp[1][0], dp[1][1]) * 2 >= k){
if(k & 1){
wr((k - 3) / 2 + 2), putchar('\n');
}
else{
wr(k / 2), putchar('\n');
}
}
else wr(max(dp[1][0], dp[1][1]) + k - 2 * (max(dp[1][0], dp[1][1]))), putchar('\n');
}
return 0;
}
NOIP模拟 拆网线 - 贪心策略+dp的更多相关文章
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- 2018.08.18 NOIP模拟 travel(贪心)
Travel 题目背景 SOURCE:NOIP2015-SHY4 题目描述 小 A 要进行一次旅行.这回他要在序号为 1 到 n 的 n 个城市之间旅行.这 n 个城市之间共有 m 条连接两个城市的单 ...
- noip 模拟赛 匹配 //贪婪策略
匹配(match.pas/match.c/match.cpp) [题目描述] 到了新的学期,Mcx痛苦的发现通用技术课居然是有实验课的,这样的话他就不得不放弃写作业的想法而去做一件类似于搭积木的事情. ...
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 2018.10.04 NOIP模拟 航班(tarjan+树形dp)
传送门 考场上自己yy了一个双连通只有40分. 然后换根dp求最长路就行了. 代码
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- 2018.09.08 NOIP模拟eat(贪心)
签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role ...
- 2018.08.19 NOIP模拟 number(类数位dp)
Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...
- 【NOIP模拟题】Incr(dp)
太水的dp没啥好说的.. #include <cstdio> #include <cstring> #include <cmath> #include <st ...
随机推荐
- 关于数据库中的JOIN的用法学习
下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: ...
- OpenWrt配置绿联的usb转Ethernet网口驱动
这个选择kernel modules中的kmod-usb-net-asix 须要加入网络设备接口.相似建立一个vlan,配置下防火墙之类的.
- Android开发人员应该知道的Kotlin
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/01/kotlin-android Android开发人员在语言限制方面面临着 ...
- 第一个Python程序(全面)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.Windows系统 1.编写Python程序方式之Sublime文本编辑器: 1>打开sublime,创建hello.p ...
- postman--基本使用1
本文转自:http://blog.csdn.net/five3/article/details/53021084 HTTP的接口测试工具有很多,可以进行http请求的方式也有很多,但是可以直接拿来就用 ...
- StackExchange.Redis 官方文档(五) Keys, Values and Channels
原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...
- python中线程、进程和协程的区别
进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程至 ...
- TTS-零基础入门之语音模板化
上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...
- jQuery笔记---选择器(三)
1.1查找隐藏的tr元素的个数 $(“table tr:hidden”).size() 查找所有可见的tr元素的个数 $(“table tr:not(:hidden)”).size() 一般是不使 ...
- minizlib
ZLIB开源库采用的是DEFLATE压缩算法,已经不支持加密功能,实际上功能还存在于代码中,采用MINIZIP可以支持对ZIP文件的加解密. ZLIB目前最新的是1.2.7,MINIZIP最新的版本是 ...