博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
消防局的设立
阅读量:4331 次
发布时间:2019-06-06

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

一道可以用贪心做的树形DP题。

对于深度最深的点,要使它被覆盖到,可以在它的兄弟、父亲、爷爷处设立消防局,而在它的爷爷设置消防局最优因为这样可以管到爷爷的爷爷

每设立一个消防局,又要把它能管到的地方都标记一遍。所以要打两个标记。一个标记记录它是否被任何一个消防局管到过\(vis\)。一个标记\(book\)记录它能否被当前设立的这一个消防局管到,这个标记要在设立下一个消防局时清零。

原因:\(book\)是防止父亲和儿子之间来回搜(加的双向边嘛)。如果遇到一个点的\(book\)为1,就会\(continue\),但如果这个\(book\)是被之前设立的消防局标记的,就会出现错误。

举个例子:

enter image description here

假如第一次取出最深的点1,相当于在右边的蓝色点设立消防局,那么所有红色的点的\(book\)都被标记过了。如果不清0的话,第二次选到2号点,相当于在左边的蓝色点设立消防局,它应该将所有标箭头的点都标记,但以为上一次标记的\(book\)没有清空,当搜到最上面的红色的点时,就会返回,所以橙色的点并没有被标记到(它应该被标记)。那么下次又会取出橙色的点。很明显答案错误。

#include
#include
#include
#include
using namespace std;const int N = 10005;int n,head[N],tot,ans;struct edge{ int next,node;}e[20005];struct nod{ int dep,p;}a[N];bool vis[N],book[N];void add(int x,int y){ e[++tot].node=y; e[tot].next =head[x]; head[x]=tot;}bool cmp(nod a,nod b){ return a.dep >b.dep;}void build(int u,int fa){ a[u].p=u; a[u].dep=a[fa].dep+1; for(int i=head[u];i;i=e[i].next) { int v=e[i].node; if(v==fa) continue; build(v,u); }}void dfs(int u,int sum){ book[u]=vis[u]=1; if(!sum) { book[u]=0; return;} for(int i=head[u];i;i=e[i].next) { int v=e[i].node; if(book[v]) continue; dfs(v,sum-1); } book[u]=0;}/*void dfs(int x,int size){ vis[x]=book[x]=1; for(int i=head[x];i;i=e[i].next) { int to=e[i].node; if(!book[to]&&size>0) dfs(to,size-1); } book[x]=0;}*/int main(){ scanf("%d",&n); int x; for(int i=2;i<=n;i++) { scanf("%d",&x); add(i,x); add(x,i); } build(1,0); sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) if(!vis[a[i].p]) ++ans,dfs(a[i].p,4); printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/karryW/p/11478624.html

你可能感兴趣的文章
Equivalent Strings
查看>>
flume handler
查看>>
收藏其他博客园主写的代码,学习加自用。先表示感谢!!!
查看>>
H5 表单标签
查看>>
su 与 su - 区别
查看>>
C语言编程-9_4 字符统计
查看>>
在webconfig中写好连接后,在程序中如何调用?
查看>>
限制用户不能删除SharePoint列表中的条目(项目)
查看>>
【Linux网络编程】使用GDB调试程序
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
ZT:Linux上安装JDK,最准确
查看>>
LimeJS指南3
查看>>
关于C++ const成员的一些细节
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>
Android ListView上拉获取下一页
查看>>
算法练习题
查看>>
学习使用Django一 安装虚拟环境
查看>>