博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3069 (树形DP)
阅读量:6296 次
发布时间:2019-06-22

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

题目链接

题目大意:用最少警力,监控一个树,逮住逃犯。即最大警力去一个子树捉人时,确保父点至少被一个警察看守着。

解题思路

树结构出点、入点不明确,所以建一个无向树,从任一一个结点开始,肯定能跑完整个树。

对于一个结点,先树形dfs求出所有子树需要布置的最大警力maxSub

捉人策略如下:

边界情况,如果是叶子结点,那么需要一个警力。ans=1

如果相同最大警力子树个数=1,先去把少于最大警力的点捉完,这个结点肯定有警力留守。最后捉这个最大点。ans=maxSub

如果相同最大警力子树个数>=2,说明这个结点需要额外补一个警力,否则去一个最大子树,会被另一个最大子树钻空子。ans=maxSub+1

#include "cstdio"#include "algorithm"#include "cstring"#include "vector"using namespace std;#define maxn 1005int head[maxn],tot,u,v,n;struct Edge{    int to,next;}e[maxn*2];void addedge(int u,int v){    e[tot].to=v;    e[tot].next=head[u];    head[u]=tot++;}int dfs(int u,int pre){    int ans=-1,cnt=0;    vector
check; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to,t; if(v==pre) continue; t=dfs(v,u); check.push_back(t); ans=max(ans,t); } if(check.size()==0) return 1; for(int i=0;i
1) return ans+1; else return ans;}int main(){ //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF) { tot=0; memset(head,-1,sizeof(head)); for(int i=0;i

 

 

 

转载于:https://www.cnblogs.com/neopenx/p/4499203.html

你可能感兴趣的文章
电磁搅扰EMI
查看>>
关于导入My97DatePicker时间插件遇到的问题及解决方案
查看>>
基于python的scrapy爬虫抓取京东商品信息
查看>>
Mac设置环境变量
查看>>
cookie和session 创建和验证 原始的servlet
查看>>
Linux-Apache和PHP结合
查看>>
shell3
查看>>
CNC加工中心刀柄类型
查看>>
WordPress设计bug+WooCommerce漏洞导致网站存在被劫持风险
查看>>
新品【国内动态】服务器列表
查看>>
10月个人考核
查看>>
离线数据处理与流数据处理的区别
查看>>
照相功能
查看>>
MATLAB编程与应用系列-第2章 数组及矩阵的创建及操作(4)
查看>>
变频电源要怎么测定额定容量
查看>>
git 使用笔记 oschina ,mac
查看>>
盒子模型
查看>>
Windows平台的Eclipse-javaEE-mars相关配置
查看>>
Oracle导入导出
查看>>
每日一学|数据中心spine leaf网络架构
查看>>