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 ...
随机推荐
- Oracle调用Java类开发的存储过程、函数的方法
oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用lo ...
- 多线程在python中的使用 thread
近期想学习研究一下python中使用多线程,来提高python在爬虫项目中的效率. 如今我们在网页上查询到在python中使用的多线程的使用大多数都是使用的threading模块,可是python中另 ...
- 多校连萌15-8-12#A
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- Js里面的arguments
了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...
- 微服务实战(三):深入微服务架构的进程间通信 - DockOne.io
原文:微服务实战(三):深入微服务架构的进程间通信 - DockOne.io [编者的话]这是采用微服务架构创建自己应用系列第三篇文章.第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使 ...
- 【hdu 1403】Longest Common Substring
[链接]h在这里写链接 [题意] 求两个串的最长公共子串. [题解] Sa[i]表示的是字典序为i的后缀的起始位置. 可以把两个字符串合在一起(中间用一个比'z'大的字符分割); 则如果Sa[i-1] ...
- Searching with regular sentences will only get you so far – if you need to find something a bit tricky turn to these advanced yet simple methods--转
原文地址:http://www.theguardian.com/technology/2016/jan/15/how-to-use-search-like-a-pro-10-tips-and-tric ...
- linux终端下一些“风骚”的按键操作及Linux终端命令
linux终端下一些"风骚"的按键操作 <backspace> 删除 <ctrl-l> 清空屏幕, 相当于clear tab ...
- 10.12 android输入系统_InputStage理论
android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...
- 三国武将查询系统 //Java 訪问 数据库
import java.awt.*; import javax.swing.*; import java.awt.event.ActionListener; import java.awt.event ...