题目描述

将一棵n个点的树分为若干“块”,每个块满足:大小在B到3B之间,并且这个“块”添加某个点后连通。求方案。

输入

第一行包含两个数N,B(1<=N<=1000, 1 <= B <= N)。接下来N-1行,每行描述一条边,包含两个数,即这条边连接的两个城市的编号。

输出

如果无法满足国王的要求,输出0。否则输出数K,表示你给出的划分方案中省的个数,编号为1..K。第二行输出N个数,第I个数表示编号为I的城市属于的省的编号,第三行输出K个数,表示这K个省的省会的城市编号,如果有多种方案,你可以输出任意一种。

样例输入

8 2
1 2
2 3
1 8
8 7
8 6
4 6
6 5

样例输出

3
2 1 1 3 3 3 3 2
2 1 8


题解

树分块

给树分块的方法:

对原树进行DFS,维护一个栈,当DFS到每个点时记录栈顶位置。

当处理完某个子节点时,如果当前栈顶位置与原来位置相差大于等于B,则将它们之间的点分为一块。最后把这个点压入栈中。

最后DFS完整棵树后,栈中剩余的点放到最后一块中。

证明可以参考 VFK’s Blog

时间复杂度$O(n)$

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define N 1010
  5. using namespace std;
  6. int b , head[N] , to[N << 1] , next[N << 1] , cnt , sta[N] , top , bl[N] , v[N] , num;
  7. void add(int x , int y)
  8. {
  9. to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
  10. }
  11. void dfs(int x , int fa)
  12. {
  13. int i , now = top;
  14. for(i = head[x] ; i ; i = next[i])
  15. {
  16. if(to[i] != fa)
  17. {
  18. dfs(to[i] , x);
  19. if(top - now >= b)
  20. {
  21. v[++num] = x;
  22. while(top != now) bl[sta[top -- ]] = num;
  23. }
  24. }
  25. }
  26. sta[++top] = x;
  27. }
  28. int main()
  29. {
  30. int n , i , x , y;
  31. scanf("%d%d" , &n , &b);
  32. for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
  33. dfs(1 , 0);
  34. while(top) bl[sta[top -- ]] = num;
  35. printf("%d\n" , num);
  36. for(i = 1 ; i <= n ; i ++ ) printf("%d " , bl[i]);
  37. printf("\n");
  38. for(i = 1 ; i <= num ; i ++ ) printf("%d " , v[i]);
  39. printf("\n");
  40. return 0;
  41. }

【bzoj1086】[SCOI2005]王室联邦 树分块的更多相关文章

  1. bzoj1086 [SCOI2005]王室联邦 树分块

    [bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...

  2. BZOJ1086 王室联邦 —— 树分块

    题目链接:https://vjudge.net/problem/HYSBZ-1086 1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 16 ...

  3. BZOJ1086: [SCOI2005]王室联邦(贪心,分块?)

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2610  Solved: 1584[Submit][Status] ...

  4. BZOJ1086 [SCOI2005]王室联邦

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

  5. 2018.09.16 bzoj1086: [SCOI2005]王室联邦(贪心)

    传送门 就是给树分块. 对于一个节点. 如果它的几棵子树加起来超过了下限,就把它们分成一块. 这样每次可能会剩下几个节点. 把它们都加入栈中最顶上那一块就行了. 代码: #include<bit ...

  6. BZOJ1086 SCOI2005王室联邦

    想学树上莫队结果做了个树分块. 看完题后想到了菊花图的形状认为无解,结果仔细一瞧省会可以在外省尴尬 对于每一颗子树进行深搜,一旦遇到加在一起大小达到B则将它们并为一省,因为他子树搜完以后没有分出块的大 ...

  7. BZOJ1086 [SCOI2005]王室联邦 【dfs + 贪心】

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

  8. BZOJ1086 [SCOI2005]王室联邦(树分块)

    把树的结点分块,块内结点连通且个数[b,3b]. 一遍DFS,维护一个栈,设置一个虚拟栈底以保证连通,递归返回时判断栈内元素个数是否大于等于b,是则划分为一个块,最后剩下的与最后一个块划分在一起. h ...

  9. BZOJ-1086 [SCOI2005]王室联邦 (树分块)

    递归处理子树,把当前结点当作栈底,然后递归,回溯回来之后如果栈中结点数量到达某一个标准时,弹出栈中所有的元素分到一个块中,最后递归结束了如果栈中还有元素,那么剩下的这些元素放在新的块中 题目:BZOJ ...

随机推荐

  1. oracle的局部本地分区索引

    环境:oracle 12.2.0.1 注:未确定10g,11g是否有这些特性.现在基本不用10g,主要用12c,11g. 毫无疑问,这种 特性对于dba或者实施人员而言显得很重要,尤其当你的数据库主要 ...

  2. pt-online-schema-change 脚本化

    mysql在线更改表可用工具 pt-online-schema-change 更改,或者用gh-ost更改.pt-online-schema-change 在原表创建索引,跟踪新插入的数据.gh-os ...

  3. Linux分享笔记:shell终端的介绍

    [1] Linux中 “shell终端” 和 “bash解释器” 的区别 shell终端是通过基于系统调用接口开发出的程序,用来让用户与系统进行对话,管理计Linux系统.它是一个命令行工具,操作类似 ...

  4. jQuery的封装

    封装,最简单的效果就是一个效果你可以重复的去调用   本来前端之路时间不是很长,但是对封装还是有一点点自己个人的理解,曾经踩过的坑也不在少数,最后总结出我个人风格的封装,听一位大神指点过,每个人都有属 ...

  5. 【ospf-vlink虚拟连接】

    根据项目需求,搭建好如下拓扑图 配置rt1的环回 口地址及g0/0/0的ip地址 配置rt1的ospf 配置rt2的环回口地址和g0/0/1及g0/0/0的ip地址 \ 配置rt2的ospf 同理,配 ...

  6. Angular : 基础语句说明, 响应式表单指令, 组件生命周期钩子

  7. js实现监听浏览器窗口大小改变事件

    window.onresize = function(){   }

  8. Java学习笔记九:Java的循环跳转语句

    Java的循环跳转语句 一:Java循环跳转语句之break: 生活中,我们经常会因为某些原因中断既定的任务安排.如在参加 10000 米长跑时,才跑了 500 米就由于体力不支,需要退出比赛.在 J ...

  9. 一笔画问题 南阳acm42(貌似没用到什么算法)

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  10. 如何在WIN7_64环境下安装Oracle10g_64位版本

    转载请注明出处http://www.cnblogs.com/SharpL/p/4338638.html 1.如果之前安装过Oracle软件,建议完全卸载(究竟有没有必要_不知道_我是这么做的) 2.清 ...