题目

给出一棵树,求一种分块方案,使得每个块的大小\(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. axios请求封装和异常统一处理

    前端网络请求封装前端采用了axios来处理网络请求,为了避免在每次请求时都去判断各种各样的网络情况,比如连接超时.服务器内部错误.权限不足等等不一而足,我对axios进行了简单的封装,这里主要使用了a ...

  2. 笔记-django-视图

    笔记-django-视图 1.      dispatch 1.1.    overview To design URLs for an app, you create a Python module ...

  3. 20145207 myeclipse测试

    实验博客  

  4. Oracle锁表处理

    最近系统连续出现好几次锁表,昨晚又发生一次锁表,11点钟跑到客户现场,进过跟踪发现导致这次锁表的机器和上一次是同一台,花了近半小时解锁.之后到科室找到那台机器看看情况,发现那台机器速度超慢,保存一份病 ...

  5. Siki_Unity_1-6_C#编程初级教程(未学)

    Unity 1-6 C#编程初级教程 任务1:C#和.Net框架 C#是.Net里的一个成分 2002年微软发布第一个.Net框架(多平台,行业标准,安全性) .Net框架 IDE编程工具 --产生- ...

  6. 前端开发工程师 - 01.页面制作 - 第1章.Photoshop切图

    第1章--Photoshop切图 工具.面板.视图 什么是切图? 1. 从设计稿(.psd)中切出网络素材,如按钮.图标.logo.背景图等 2. 编写代码,在代码中使用图片,生成静态页面 --给网页 ...

  7. java代码读取yarn聚合目录日志

    可以直接使用org.apache.hadoop.yarn.client.cli.LogsCLI(yarn logs -applicationId)中的main方法逻辑,如 public static ...

  8. linux 命令行基础

    命令行基础 一些名词 「图形界面」 「命令行」 「终端」 「shell」 「bash」 安装使用 Windws: 安装git, 打开 gitbash Linux 打开终端 Mac 打开终端 基本命令 ...

  9. LeetCode 445——两数相加 II

    1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...

  10. LeetCode 102 ——二叉树的层次遍历

    1. 题目 2. 解答 定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level_data 和一个存放每一层节点的队列 node_queue. 如果根节点非空,根节点进队,然后循 ...