BZOJ 1086 王室联邦

题意

把一棵树分块,每块大小在[B, 3B]之间(B由输入数据给出),每个块需要对应一个核心点,核心点可以在块内,这个点要满足块内每个点到核心点的路径上的点都属于这个块(核心点本身不算),请输出分块方案。

题解

VFK的糖果公园题解让我先来把这道题做了……

做法:直接BFS。

显然我们需要维护一个栈来存储节点编号。

对于一个子树u, 记录刚进入子树时的top,然后BFS所有子树,每当BFS完一个子树并发现新top - 原top >= B时,就把旧top以上的所有点弹出作为一个块,核心点是当前子树的根节点u。

注意最后可能有一块与根节点相连的部分没有归到任何块里,把它归到最后一个块中。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. template <class T>
  8. void read(T &x){
  9. char c;
  10. bool op = 0;
  11. while(c = getchar(), c < '0' || c > '9')
  12. if(c == '-') op = 1;
  13. x = c - '0';
  14. while(c = getchar(), c >= '0' && c <= '9')
  15. x = x * 10 + c - '0';
  16. if(op) x = -x;
  17. }
  18. template <class T>
  19. void write(T x){
  20. if(x < 0) putchar('-'), x = -x;
  21. if(x >= 10) write(x / 10);
  22. putchar('0' + x % 10);
  23. }
  24. #define space putchar(' ')
  25. #define enter putchar('\n')
  26. const int N = 1005;
  27. int n, B, stk[N], top, bel[N], cap[N], idx;
  28. int ecnt, adj[N], nxt[2*N], go[2*N];
  29. void add(int u, int v){
  30. go[++ecnt] = v;
  31. nxt[ecnt] = adj[u];
  32. adj[u] = ecnt;
  33. }
  34. void dfs(int u, int pre){
  35. int st = top;
  36. for(int e = adj[u], v; e; e = nxt[e])
  37. if(v = go[e], v != pre){
  38. dfs(v, u);
  39. if(top - st >= B){
  40. cap[++idx] = u;
  41. while(top > st) bel[stk[top--]] = idx;
  42. }
  43. }
  44. stk[++top] = u;
  45. }
  46. int main(){
  47. read(n), read(B);
  48. for(int i = 1, u, v; i < n; i++)
  49. read(u), read(v), add(u, v), add(v, u);
  50. dfs(1, 0);
  51. while(top) bel[stk[top--]] = idx;
  52. write(idx), enter;
  53. for(int i = 1; i <= n; i++)
  54. write(bel[i]), i == n ? enter : space;
  55. for(int i = 1; i <= idx; i++)
  56. write(cap[i]), i == idx ? enter : space;
  57. return 0;
  58. }

BZOJ 1086 王室联邦 | BFS的更多相关文章

  1. BZOJ 1086 王室联邦

    http://www.lydsy.com/JudgeOnline/problem.php?id=1086 思路:贪心,每次当储存的儿子大于等于B时,分出一个块,这样每次每个块至多为2B,这样剩下的没有 ...

  2. bzoj 1086 王室联邦 —— 思路题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 一眼看去很是不会,于是看看TJ... https://blog.csdn.net/ly ...

  3. HYSBZ 1086 王室联邦 (树的分块)

    题意:国王想把他的国家划分成若干个省.他的国家有n个城市,是一棵树,即n-1条边,编号为1..n.为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市.每个省必须有 ...

  4. 【BZOJ】【1086】 【SCOI2005】王室联邦

    树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...

  5. BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1399  Solved: ...

  6. 【块状树】BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 826  Solved:  ...

  7. Bzoj 1086: [SCOI2005]王室联邦(分块)

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...

  8. [BZOJ 1086] [SCOI2005] 王室联邦 【树分块】

    题目链接:BZOJ - 1086 题目分析 这道题要求给树分块,使得每一块的大小在 [B, 3B] 之间,并且可以通过一个块外的节点(块根)使得整个块联通. 那么我们使用一种 DFS,维护一个栈,DF ...

  9. bzoj 1086: [SCOI2005]王室联邦 (分块+dfs)

    Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...

随机推荐

  1. NOI备战总结ing……

    持续做题ing…… 已完成: 树套树 点分治 博弈论 凸包 杜教筛 反演 FFT 数位DP DP专栏 网络流 数学专栏 正在进行中: waiting: SAM Kd-tree 矩阵树 分治 FWT B ...

  2. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  3. 【题解】 [ZJOI2006]书架 (Splay)

    懒得复制,戳我戳我 Solution: 还是一个\(Splay\),我们只用多存一个值\(rad\)来维护二叉树,然后用数组存下每个书对应的值是多少 \(Top\)操作,我是把\(s\)旋转到根节点, ...

  4. HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)

    前缀数组其实就是有序的,那么答案显然是      我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知  令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...

  5. Redis数据类型和常用命令

    Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事.一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化. 数据类型和对应命令 所有存储于redis中的数据都对应于一个键值 ...

  6. Access时间日期函数大全

    这里特别推荐WeekdayName() 函数.MonthName() 函数,将日期转换为中文星期名与月份,如"星期一"."五月"一.Date() 函数.Now( ...

  7. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  8. [整理]Assembly中的DLL提取

    当机器上安装一些程序后,Assembly中的DLL会变得越来越丰富. 拿个常见问题来说明. 安装ReportViewer后其中会出现以下DLL. Microsoft.ReportViewer.Proc ...

  9. XHR工厂的实现

    ajax这种常见的开发模式已经遍布我们日常的开发之中了,ajax本质还是采用一种轮询的模式,就是隔一段时间去发送一次http请求,获取数据,然后显示在页面之上,当然,ajax比起新兴的WebScoke ...

  10. css框架,一把锋利的剑

    CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块,用于简化web前端开发的工作,提高工作效率. 产生原因 互联网行业已经发展了多年,浏览 ...