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

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

  啦啦啦,又是五月天的歌~~~~~~

  

  那么来分析下题目;给定你一棵树,告诉你一支队伍能管辖的范围,求能覆盖整棵树的最少队伍数。

  嘛,如果不会做,第一个想到的肯定是暴搜嘛,但是代码打起来肯定也非常麻烦。正解其实和最短路有类似的地方,也需要用到树状结构里常用的father数组;首先给定你一棵树以后,以一号结点为根,一遍广搜确定每个结点的father,也就是无根树转有根树;然后按照队列入队的逆序开始遍历,如果该点没有被控制,那么就从这个结点的第K个祖先开始深搜,这样才能控制尽可能多的点(想不通的话可以自己画棵树试试看),在深搜过程中也要注意更新dis值,不然就会挂的很惨了!如果不懂,结合代码分析应该很好理解:

#include
#define N 100010using namespace std;int n,k,t,que[N],fa[N];int head[N],dis[N],size;struct Node{
int to,next;}edge[N<<1];bool exity[N];inline int read(){ char ch=getchar();int num=0;bool flag=false; while(ch<'0'||ch>'9'){
if(ch=='-')flag=true;ch=getchar();} while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();} return flag?-num:num;}void add(int x,int y){ edge[++size].to=y; edge[size].next=head[x]; head[x]=size;}void bfs(){ fa[1]=1;que[1]=1; int h=0,t=1; while(h
=1;i--){ int x=que[i]; if(!exity[x]){ ++ans; for(int j=k;j>0;j--)x=fa[x]; dfs(x,k); } } printf("%d",ans); return ;}int main(){ ready(); work(); return 0;}

就是这样了,这题就这么过去了~~~

转载于:https://www.cnblogs.com/cytus/p/7778225.html

你可能感兴趣的文章
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
OpenCV矩阵运算总结
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
更改git仓库地址
查看>>
有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
查看>>
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>
「破解」Xposed强
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>