Description

  “余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成
员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条
直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个
城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经
过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的
你快帮帮这个国王吧!

Input

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

Output

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

Sample Input

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

Sample Output

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

题解(转载)

->原文地址<-

大神们都一句话带过。

在网上扒了老长时间,才领悟。

整理一下,发给大家。

先说一个问题:

如果在当前节点,其有两个儿子。

在左儿子的子树中搜得的节点数是$a-1$的话,这时候我们去搜右儿子,不妨假设右儿子为根的子树是一条长为$10000$的链。

那么显然最下面的叶节点跟左儿子代表的子树是在同一块中的,这显然碎成渣了。

所以每一次搜到一个节点,我们都要把当前的栈的指针当做该节点的相对栈底,这样的话就能避免这个问题。

首先以任意节点为根$DFS$,$DFS$的任务是解决以当前节点为根的子树(不包括当前节点)中的节点的归属,并汇报不知道去向何方者。

具体做法是:

对于每个正在处理的节点$v$,定义一个等待序列,扫一遍它的孩子。在扫的时候,假设当前$for$循环正在处理的是孩子$u$,$DFS(u)$,然后把传回来的等待序列加到$v$的等待序列中。如果$v$的等待序列节点数超过了$B$,那么就让等待队列中的节点组成一个省,省会是$v$,但$v$不划入那个省中。最后,$for$循环结束,把$v$加入到等待序列中,$return$。在主函数中接收$DFS$的返回值,若等待序列为空,皆大欢喜;但事实上,等待序列不可能为空。

那么等待序列中的节点数一定不超过$B + 1$,怎么办?答案就是放在上一个被划分出的省中去,那么上一个被划分出的省一定$<=2B - 1$,而现在最后无家可归的节点数一定$<= B + 1$,所以放在上一个被划分出的省中去节点数一定不超过$3B$!而且最后被划分出来的省一定和最后无家可归的节点中的某一个相邻!那么考虑什么时候会出现无解呢?答案就是我们找不到“上一个被划分出的省”

  1. //It is made by Awson on 2017.9.28
  2. #include <set>
  3. #include <map>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <queue>
  7. #include <stack>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <string>
  11. #include <cstring>
  12. #include <cstdlib>
  13. #include <iostream>
  14. #include <algorithm>
  15. #define LL long long
  16. #define Max(a, b) ((a) > (b) ? (a) : (b))
  17. #define Min(a, b) ((a) < (b) ? (a) : (b))
  18. #define sqr(x) ((x)*(x))
  19. using namespace std;
  20. const int N = ;
  21. void read(int &x) {
  22. char ch; bool flag = ;
  23. for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
  24. for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
  25. x *= -*flag;
  26. }
  27.  
  28. int n, b, u, v;
  29. int sta[N+], top;
  30. int cnt, belong[N+], root[N+];
  31. struct tt {
  32. int to, next;
  33. }edge[*N+];
  34. int path[N+], tot;
  35.  
  36. void add(int u, int v) {
  37. edge[++tot].to = v;
  38. edge[tot].next = path[u];
  39. path[u] = tot;
  40. }
  41. void dfs(int u, int fa) {
  42. int bot = top;
  43. for (int i = path[u]; i; i = edge[i].next)
  44. if (edge[i].to != fa) {
  45. dfs(edge[i].to, u);
  46. if (top-bot >= b) {
  47. root[++cnt] = u;
  48. while (top != bot) belong[sta[top--]] = cnt;
  49. }
  50. }
  51. sta[++top] = u;
  52. }
  53. void work() {
  54. read(n), read(b);
  55. for (int i = ; i < n; i++) {
  56. read(u), read(v);
  57. add(u, v); add(v, u);
  58. }
  59. dfs(, );
  60. while (top) belong[sta[top--]] = cnt;
  61. printf("%d\n", cnt);
  62. for (int i = ; i <= n; i++) printf("%d ", belong[i]);
  63. printf("\n");
  64. for (int i = ; i <= cnt; i++) printf("%d ", root[i]);
  65. printf("\n");
  66. }
  67. int main() {
  68. work();
  69. return ;
  70. }

[SCOI 2005]王室联邦的更多相关文章

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

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

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

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

  3. 【BZOJ-1086】王室联邦 分块 + 块状树

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

  4. BZOJ1086 [SCOI2005]王室联邦

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

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

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

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

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

  7. 1086: [SCOI2005]王室联邦

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

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

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

  9. [SCOI2005]王室联邦(构造)

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

随机推荐

  1. 如何从RxJava升级到RxJava2

    如何从RxJava升级到RxJava2. RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都 ...

  2. 配置tomcat8数据源(采用局部数据源方式)

    tomcat提供两种数据源配置方式,全局和局部.全局的话对于所有web应用都生效,局部只对于配置的某一个web生效. 步骤: 1.将mysql的jdbc驱动复制到tomcat的lib路径下. 2.在t ...

  3. 2018.3.29 DIV位置调整代码

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  4. C语言博客作业--数据类型

    一.PTA实验作业 题目1:7-8 判断合法标识符 1. 本题PTA提交列表 2. 设计思路 1.定义整数型变量repeat和i来存放判断字符串是否为合法标识符的次数,定义字符型ch来存放读取的字符 ...

  5. fs检测文件夹状态

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  6. Basys3在线调试视频指南及代码

    fpga在线调试视频链接 FPGA选择型号:xc7a35tcpg236-1 des文件 `timescale 1ns / 1ps module top( output [1:0] led, outpu ...

  7. RxSwift:ReactiveX for Swift 翻译

    RxSwift:ReactiveX for Swift 翻译 字数1787 阅读269 评论3 喜欢3 图片发自简书App RxSwift | |-LICENSE.md |-README.md |-R ...

  8. RxSwift(一)

    文/iOS_Deve(简书作者) 原文链接:http://www.jianshu.com/p/429b5160611f 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者" ...

  9. Faster R-CNN 的 RPN 是啥子?

     Faster R-CNN,由两个模块组成: 第一个模块是深度全卷积网络 RPN,用于 region proposal; 第二个模块是Fast R-CNN检测器,它使用了RPN产生的region p ...

  10. B+树介绍

    B+树 B+树和二叉树.平衡二叉树一样,都是经典的数据结构.B+树由B树和索引顺序访问方法(ISAM,是不是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经 ...