题目

给出一棵树,求一种分块方案,使得每个块的大小\(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. 在XAML中为ItemsControl定义分组,适合mvvm绑定

    可以先参考一下这个文章: http://www.cnblogs.com/zoexia/archive/2014/11/30/4134012.html step0: 先展示一下最简陋的界面: 上图是一个 ...

  2. Lvm linux磁盘分区管理(多个分区合并成一个)

    备份# rsync -avP -e ssh /data qqmap@10.173.139.100:/data1/qqmap/backup/10.234.22.143卸载# umount /data / ...

  3. 在线大数据cdh迁移,从公有云迁移到私有云

    1.添加新节点 2.迁移hdfs和hbase数据: 3.迁移源节点各个服务到新节点: 4.利用HA,包括hdfs,hbase master,resourcemanager的ha实现在线迁移: 5.数据 ...

  4. 利尔达CC3200模块第一篇之-wlan_ap例程测试

    1. 本次采用利尔达的CC3200模块,CC3200主时钟80M,内部没有flash,必须外接SPI Flash.本次测试采用利尔达科技的CC3200的底板和模块(左边).烧写连接VCC, GND, ...

  5. EF Core注意事项

    流程:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db 1.Both Entity Framework 6. ...

  6. Centos 7 快速安装 Docker

    摘要: 安装 Docker [root@localhost~]# yum install docker 启动 docker 服务 [root@localhost~]# systemctl start ...

  7. mysql5.6 无法远程连接问题解决

    需要配置mysql5.6版本的my.cnf文件,我的my.cnf文件配置如下: port=3306是我后来自己加上的.加上这个之后重启mysql service mysqld restart 记得给r ...

  8. Jmeter接口测试(二)工具介绍

    一.Jmeter文件目录介绍 ◆ bin:可执行文件目录 Bin 目录文件 jmeter.bat:windows 的启动文件 jmeter.log:日志文件 jmeter.sh:linux 的启动文件 ...

  9. 使用pycharm软件配置数据库可视化

    必须品: pycharm软件,专业版最好自带就有,社区版就需要安装下插件. 专业版直接会在右边的编辑框浮动,直接点开就可以配置. 如图所示,点开就可以配置相应的数据库, 点开配置完毕就可以使用了. 还 ...

  10. 【RandomString】- 随机字符串

    RandomString  随机字符串的用法