博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将军令
阅读量:5891 次
发布时间:2019-06-19

本文共 1881 字,大约阅读时间需要 6 分钟。

  题目链接:

 

 题解:

  当k一定且很小(1或2)时,明显这就成了一道树形dp。也就是说如果你写过的话这道题就可以至少拿75分。(或者你花上几个小时推出+调试k=3时的dp方程就可以拿到90分啦qaq)

  但是这道题显然不是这么做的。其实我们只要稍稍贪心一下即可。一个明显的性质是在能控制到一个节点的情况下,小队的深度越浅越好。(因为这样它就可以控制更多的点)。

  我们先任选一个节点为根,把无根树转化成有根树。然后遍历整棵树,维护子节点对父亲节点的要求。再以子节点的信息更新父亲节点即可。

  我们设v[x]表示节点x上方距离v[x]一定要有一个小队。(当v[x]==1时就是x节点的父亲节点一定要是小队)。那么比较容易发现的更新条件就是:叶子节点的v[]为k;当一个节点的子节点中有一个的v[]为1时该节点就一定是小队;一个小队节点的v[]为(2*k+1);不满足上述条件时v[x]=min{v[y]|y是x的子节点}-1。

  但是其实上述思路是有漏洞的。比如当k=1时,其左孩子的v[]为2,其右孩子的v[]为3时,其实该节点的v[]值为2。(因为他左子树中未被覆盖的点可以被右子树覆盖)。我放张图大家理解一下:

  运用数学归纳法(其实就是找规律qwq)可以得出的结论是:对于节点x的子节点y来说,若v[y]+maxx>=2*k+3(maxx为x节点的子节点中最大的v[]值),则该子节点y不需被考虑。

  另外,当k==0时该方法无法处理,所以我加了个特判。(当然你也可以在dfs时处理,但加个特判显然更方便=-=)。

 

#include
#include
#include
#include
#include
#define LL long long#define RI register intusing namespace std;const int INF = 0x7ffffff ;const int N = 1e5 + 10 ;inline int read() { int k = 0 , f = 1 ; char c = getchar() ; for( ; !isdigit(c) ; c = getchar()) if(c == '-') f = -1 ; for( ; isdigit(c) ; c = getchar()) k = k*10 + c-'0' ; return k*f ;}struct Edge { int to, next ;}e[N<<1] ;int n, k, t, ans = 0 ; int head[N] ;inline void add_edge(int x,int y) { static int cnt = 0 ; e[++cnt].to = y, e[cnt].next = head[x], head[x] = cnt ;}int v[N] ; // x:上面距离x位置一定要有一个小队 void dfs(int x,int f) { int y ; vector
hh ; for(int i=head[x];i;i=e[i].next) { y = e[i].to ; if(y == f) continue ; dfs(y,x) ; } int mi = INF, mx = -INF ; for(int i=head[x];i;i=e[i].next) { y = e[i].to ; if(y == f) continue ; hh.push_back(v[y]) ; mx = max(mx,v[y]), mi = min(mi,v[y]) ; } if(mi == INF) { v[x] = k ; return ; } sort(hh.begin(),hh.end()) ; int mm = hh.size(), i ; for(i=0;i
View Code

 

——end ;

转载于:https://www.cnblogs.com/zub23333/p/8566426.html

你可能感兴趣的文章
严肃科普:12306能扛得住明星并发出轨级的流量吗?
查看>>
iOS程序员学习android之一
查看>>
vue.js 高德地图
查看>>
live555编译
查看>>
【译】测试驱动开发:使用 Node.js 和 MongoDB 构建 Todo API
查看>>
【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇
查看>>
Node_Express
查看>>
Symfony2.8 源码分析之类的加载
查看>>
BTree的Java简单实现
查看>>
Ubuntu14.04LTS安装系统负载指示器(在最上方任务栏显示实时系统信息)
查看>>
利器在手, 啥都顺手
查看>>
MIT经典计算机课程:计算思维及数据科学导论
查看>>
常用正则表达式整理
查看>>
Python代码覆盖率分析工具Coverage
查看>>
ExTiX 19.3 发布,基于 Ubuntu 的桌面 Linux 发行
查看>>
UITableView基础[ 1 ] 基本TableView的实现
查看>>
react 前端项目技术选型、开发工具、周边生态
查看>>
开启mysql远程访问过程中所遇常见问题的解决办法 ...
查看>>
使用 Dataworks 实现 AnalyticDB for PostgreSQL 上的 ETL 作业调度
查看>>
Navicat生成更新数据库结构同步的数据库
查看>>