题目

给出一棵树,求一种分块方案,使得每个块的大小\(size\in [B,3B]\)。每个块还要选一个省会,省会可以在块外,但是省会到块内任何一个点路径上的所有除了省会的点都必须属于这个块。\(n\le 1000\)。

分析

一次dfs即可解决。做法如下:

  • 任意选取一个点开始dfs
  • 对一个点,搜索它的所有儿子
  • 如果搜索完一个儿子后发现栈中元素大于\(B\)个,那么把栈中的元素分成一个块
  • 否则继续搜索
  • 一个点dfs结束时把它本身入栈

实现中有一个问题,对于一个儿子,它在栈中积累了不到\(B\)个点,而在下一个搜索的儿子的下层达到了\(B\)个点,那么这样两个块就会不连通,出现问题。所以我们每次设置一个bottom,意为对于这个儿子它的栈底是哪里,这样就可以保证不会弹出之前的节点,从而保证连通性。每次弹栈的时候把当前搜索的节点设为省会,就一定能够符合要求。最后搜索完之后栈中会剩下一些节点,而这些节点必定与最后一个块连通,而最后一个块的节点个数和剩下的节点个数和\(sum\in (2B,3B]\),所以可以归进同一个块内。代码实现非常简单。

这道题是树分块方法的模版题,树分块在很多树上询问问题中都有应用。

代码

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e3+1;
int n,b,gs=0;
int sta[maxn],top=0;
int id[maxn],cap[maxn];
struct edge {
int v,nxt;
} e[maxn<<1];
int h[maxn],tot=0;
void add(int u,int v) {
e[++tot]=(edge){v,h[u]};
h[u]=tot;
}
void dfs(int x,int fa,int bot) {
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) if (v!=fa) {
dfs(v,x,top);
if (top-bot>=b) {
++gs;
cap[gs]=x;
while (top!=bot) id[sta[top--]]=gs;
}
}
sta[++top]=x;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
n=read(),b=read();
for (int i=1;i<n;++i) {
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1,0,top);
while (top) id[sta[top--]]=gs;
printf("%d\n",gs);
for (int i=1;i<=n;++i) printf("%d ",id[i]);
puts("");
for (int i=1;i<=gs;++i) printf("%d ",cap[i]);
puts("");
return 0;
}

bzoj1086-王室联邦的更多相关文章

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

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

  2. Count on a tree II SPOJ - COT2 && bzoj1086 王室联邦 && bzoj2589

    https://cn.vjudge.net/problem/SPOJ-COT2 这个是树上莫队模版啊.. 树上莫队有两种,第一种就是括号序莫队 设节点i在括号序中首次出现位置为pl[i] 那么路径(i ...

  3. BZOJ1086:[SCOI2005]王室联邦——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题面源于洛谷. 题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每 ...

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

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

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

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

  6. BZOJ1086 [SCOI2005]王室联邦

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

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

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

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

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

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

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

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

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

随机推荐

  1. SpaceVim 语言模块 erlang

    原文连接: https://spacevim.org/cn/layers/lang/erlang/ 模块简介 功能特性 启用模块 快捷键 语言专属快捷键 交互式编程 模块简介 这一模块为 SpaceV ...

  2. PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证

    权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,= ...

  3. git忽略项gitegnore配置

    在git中如果想忽略掉某个文件, 不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则 例如 # 此为注释 – 将被 Git 忽略 *.a # ...

  4. iReport jasperReports 生成表格

    使用iReport生成表格   一 环境:iReport-5.6.0  JDK7 1.注意,iReport的最新版本目前还不支持JDK8,如果项目工程已经配置了JDK8,那也不用去修改环境变量和工程的 ...

  5. 聊聊WS-Federation(test)

    本文来自网易云社区 单点登录(Single Sign On),简称为 SSO,目前已经被大家所熟知.简单的说, 就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 举例: 我们 ...

  6. 学会了vim中的自动补全功能

    好开心,再也不用再多个工具之间切换了,哈哈 擦,功能太弱

  7. 关于Python 中的 if 语句

    学习Python,最开始我们都是先从函数学起,Python教程中有很多函数,if算是其中之一. 可能最为人所熟知的编程语句就是 if 语句了.例如: >>> >>> ...

  8. 深入理解java虚拟机学习笔记(一)

    第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ...

  9. python程序设计——函数设计与调用

    一.函数定义与调用 def 函数名([参数列表]): '''注释''' 函数体 # 输出小于n的斐波那契数 >>def fib(n): a,b=1,1 while a < n: pr ...

  10. [Clr via C#读书笔记]Cp8方法

    Cp8方法 构造器 作用就是初始化所有成员字段:.ctor:派生类和基类都有自己的构造函数.默认有一个无参数的构造函数,值字段初始化为0,引用字段初始化为null:可以有多个构造器: 值类型的初始化其 ...