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 ...
随机推荐
- GO语言学习(十三)Go 语言变量作用域
Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...
- ACCESS数据库改名asp或asa
到把mdb改为asp或asa ACCESS数据库:把数据库后缀名改成ASP是防止ACCESS数据库被下载
- VC error link
错误1:LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main在project-setting-link里找到pro ...
- 洛谷 P3131 [USACO16JAN]子共七Subsequences Summing to Sevens
P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's NN cows are standing in a row ...
- HTTP网络协议(三)
HTTP首部字段有四种类型:通用首部字段,请求首部字段,响应首部字段,实体首部字段. 通用首部字段: 首部字段 说明 Cache-Control 控制缓存的行为 Connection 逐跳首部.连接 ...
- 微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io
原文:微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io [编者的话]这是用微服务开发应用系列博客的第七篇也是最后一篇.第一篇中介绍了微服务架构模式,并且讨论了微服架构的优缺点: ...
- python整除
1.'/'除号与c不同,单个'/'是浮点除,两个除号'//'才是整除
- 【习题 3-4 UVA - 455】Periodic Strings
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举 [代码] #include <bits/stdc++.h> using namespace std; const ...
- 使用GDB进行嵌入式远程调试
PC主机:Ubuntu 10.4 目标板:TQ2440开发板,linux内核2.6.30 NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦. 使用nfs服务可以参考:S3C ...
- 33、给华美A100刷固件
给HAME A100刷固件 目的: 1. 给HAME A100刷固件 2. 配置上UVC驱动 3. 修改内核自带的UVC驱动,使其支持我们自制的二合一摄像头 4. 移植mjpg-streamer 5. ...