搜索的最广泛应用优化——剪枝

这道题的dp和贪心都是无正确性的,所以,搜~~~~~~~

搜的时候你发现不剪枝极容易被卡掉(然而良心NOIP没有这么做,不剪枝仍然飞快),所以我们需要一些玄学的剪枝最常见的有俩:I.我们一层一层累加被感染人群若当前被感染人群已经大于已知解那么就舍去。 II.之后的每一层如果都取最大仍不如已知解优则舍去。

玄学.........

  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. #define MAXN 310
  5. namespace pre{
  6. inline void read(int &sum){
  7. register char ch=getchar();
  8. for(sum=;ch<''||ch>'';ch=getchar());
  9. for(;ch>=''&&ch<='';sum=(sum<<)+(sum<<)+ch-'',ch=getchar());
  10. }
  11. inline int Max(int x,int y){
  12. return x>y?x:y;
  13. }
  14. int ans;
  15. }
  16. namespace tree{
  17. struct tree{
  18. int to,next;
  19. }c[MAXN<<];
  20. int head[MAXN],t,size[MAXN],f[MAXN],Deep_Max,Max[MAXN];
  21. bool did[MAXN];
  22. std::vector<int> floor[MAXN];
  23. inline int comp(int x,int y){
  24. return size[x]>size[y];
  25. }
  26. inline void add(int x,int y){
  27. c[++t].to=y;
  28. c[t].next=head[x];
  29. head[x]=t;
  30. }
  31. inline void dfs(int x,int fa,int deep){
  32. Deep_Max=pre::Max(deep,Deep_Max);
  33. size[x]=;
  34. f[x]=fa;
  35. floor[deep].push_back(x);
  36. for(int i=head[x];i;i=c[i].next)
  37. if(c[i].to!=fa)
  38. dfs(c[i].to,x,deep+),size[x]+=size[c[i].to];
  39. }
  40. inline void Dfs(int deep,int ans){
  41. //if(ans+Max[deep+1]<=pre::ans)return;
  42. pre::ans=pre::Max(ans,pre::ans);
  43. if(deep==Deep_Max)return;
  44. for(int i=;i<floor[deep+].size();i++)
  45. if(did[f[floor[deep+][i]]])
  46. did[floor[deep+][i]]=;
  47. for(int i=;i<floor[deep+].size();i++)
  48. if(did[floor[deep+][i]]==){
  49. did[floor[deep+][i]]=;
  50. Dfs(deep+,ans+size[floor[deep+][i]]);
  51. did[floor[deep+][i]]=;
  52. }
  53. for(int i=;i<floor[deep+].size();i++)
  54. if(did[f[floor[deep+][i]]])
  55. did[floor[deep+][i]]=;
  56. }
  57. }
  58. namespace mid{
  59. int n,m;
  60. inline void Init(){
  61. using pre :: read;
  62. using tree :: add;
  63. read(n),read(m);
  64. for(int i=,a,b;i<=m;i++)
  65. read(a),read(b),add(a,b),add(b,a);
  66. tree :: dfs(,,);
  67. }
  68. inline void Work(){
  69. using namespace tree;
  70. for(int i=Deep_Max;i>;i--){
  71. std::sort(floor[i].begin(),floor[i].end(),comp);
  72. Max[i]=Max[i+]+size[floor[i][]];
  73. }
  74. Dfs(,);
  75. printf("%d",n-pre::ans);
  76. }
  77. }
  78. int main(){
  79. freopen("epidemic.in","r",stdin);
  80. freopen("epidemic.out","w",stdout);
  81. mid :: Init();
  82. mid :: Work();
  83. return ;
  84. }

[NOIP2003] 传染病控制 搜索+剪枝的更多相关文章

  1. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  2. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  3. hdu 5887 搜索+剪枝

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. hdu 5113(2014北京—搜索+剪枝)

    题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...

  5. luogu 1731 搜索剪枝好题

    搜索剪枝这个东西真的是骗分利器,然鹅我这方面菜的不行,所以搜索数学dp三方面是真的应该好好训练一下 一本通的确该认真的刷嗯 #include<bits/stdc++.h> using na ...

  6. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  7. [HNOI2002]彩票 (搜索+剪枝)

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  8. luogu P3393 逃离僵尸岛-搜索剪枝+spfa

    P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...

  9. [luogu 1092] 虫食算 (暴力搜索剪枝)

    传送门 Description Input 包含四行. 第一行有一个正整数 (N≤26). 后面的三行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和.这3个字符串左右两端都没有空格,从高位 ...

随机推荐

  1. hive的load命令

    Hive Load语句不会在加载数据的时候做任何转换工作,而是纯粹的把数据文件复制/移动到Hive表对应的地址. 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVE ...

  2. 分享一个工作中遇得到的sql(按每天每人统计拖车次数与小修次数)

    查询每人每天的数据 首先先建表 CREATE TABLE `user` ( `name` ) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CR ...

  3. ionic 打包apk Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]

    错误日志如下: Built the following apk(s): /Users/hongye0/Documents/project/haitoujiaApp/platforms/android/ ...

  4. x86的控制寄存器CR0,CR1,CR2,CR3

    状态和控制寄存器组除了EFLAGS.EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3. 这几个寄存器中保存全局性和任务无关的机器状态. CR0中包含了6个预定义标志,0位是保 ...

  5. Django的命令操作,python

    忘记时候,查看命令用:python manage.py 1 建立项目的命令: django-admin.py startproject project_name 2 在项目的目录下建立app: dja ...

  6. PHP.43-TP框架商城应用实例-后台18-商品属性3-库存量管理

    库存量管理 思想:为商品的每个多选属性设置库存量!!要把多选属性排列组合分别指定库存量!! 效果如下:[由商品已经添加的属性决定] 1.建表goods_number{goods_id,goods_nu ...

  7. 如何打war包

    1. 利用jdk里的工具 例如我们要打包的文件在D:\myHome\dist: 运行 cmd: cd D:\myHome\dist 进入D:\myHome\dist 然后输入 D:\myHome\di ...

  8. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  9. 输出不重复的质因数(C++)

    [问题描述] 从键盘上输入一个大于 1 的正整数,输出它所有不等的质因数.(什么是质因数?既是质数,又是因数) [代码展示] # include<iostream>using namesp ...

  10. LeetCode 29——两数相除

    1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...