洛谷 P2325 [SCOI2005]王室联邦
简化版题意:
一个国家由\(n\)个城市组成一颗树,要将其划分为\(n\)个省
每个城市大小为\([B,3B]\),每个省有一个省会(不一定要在省内),使得每个省的所有城市到省会的路径上不能经过其他省。
首先我们可以明确,原图中的一颗完整子树一定是满足要求的。
那么我们可以这样思考,维护一个栈,由下至上递归进行合并
若当前子树的城市树已经大于B,那么我们将其合并
这样一次失败的省划分最多余留下的节点为b-1,这样每个块最大大小为2b-1,满足要求
但是,会出现一个问题,有可能当前子树未达到,而加上另一个子树就达到了B,但是按照递归顺序,这两棵子树是不连通的,那应怎么办呢?
我们可以维护一个标记limit,记录递归前栈内元素个数,这样的话就可以有效避免这个问题的发生。
但是,题目为什么要给到3B呢?
这是因为在我们遍历完所有节点后,有可能还剩余一些节点(最多为B个)。这样的话,根据上面的推断,我们可以直接将其并入最后一个块,大小最大为3B-1,符合题目要求。
于是这道题目就愉快的解决辣!
贴代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e4;
int n,b;
struct cc{
int to,nex;
}e[maxn];
int head[maxn],cnt,tag[maxn],rt[maxn],tot;
void add(int a,int b)
{
++cnt;
e[cnt].to=b;
e[cnt].nex=head[a];
head[a]=cnt;
}
stack<int> s;
void dfs(int u,int fa)
{
int lim=s.size();
for(int i=head[u];i;i=e[i].nex)
{
int v=e[i].to;
if(v!=fa)
dfs(v,u);
if(s.size()-lim>=b)
{
rt[++tot]=u;
while(s.size()>lim){
tag[s.top()]=tot;
s.pop();
}
}
}
s.push(u);
}
int main()
{
int x,y;
scanf("%d%d",&n,&b);
for(int i=1;i<n;++i)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs(1,0);
if(!tot) rt[++tot]=1;
while(!s.empty()) tag[s.top()]=tot,s.pop();
printf("%d\n",tot);
for(int i=1;i<=n;++i)
printf("%d ",tag[i]);
printf("\n");
for(int i=1;i<=tot;++i)
printf("%d ",rt[i]);
return 0;
}
洛谷 P2325 [SCOI2005]王室联邦的更多相关文章
- 洛谷P2325 [SCOI2005]王室联邦
P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市, ...
- 洛谷.2325.[SCOI2005]王室联邦(贪心)
题目链接 比较水的题 然而.. 首先可以考虑DFS 每B个分一个块,但是这样链底不会和上边相连 于是考虑从底下开始分,即在DFS完一个点时才将其加入栈中:当子树size==B时出栈 最后在根节点可能会 ...
- P2325 [SCOI2005]王室联邦 解题报告
P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有\(n\) ...
- P2325 [SCOI2005]王室联邦
题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间 ...
- luogu P2325 [SCOI2005]王室联邦
传送门 做法是dfs整棵树,当访问一个点\(x\)时,先访问儿子,若某个时刻子树大小\(\ge b\)时,就把那些点放在一个省里,省会记为\(x\),访问完儿子再把\(x\)加入栈.最后栈中剩余的没加 ...
- BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1399 Solved: ...
- 【块状树】BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 826 Solved: ...
- 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1554 Solved: ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
随机推荐
- 【译】.NET Core 3.0 中的新变化
.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...
- .net开源工作流ccflow从表数据数据源导入设置
第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow .net开源工作流 第2节. 从表数据导入设置 1.1.1: 概要说明 在从表的使用中我一般都会用到从 ...
- OpenCL中三种内存创建image的效率对比
第一种:使用ION: cl_mem_ion_host_ptr ion_host_ptr1; ion_host_ptr1.ext_host_ptr.allocation_type = CL_MEM_IO ...
- 商米D1S一体机设置搜狗手写输入法图解
按照下图步骤,一步步设置即可,询问全新的时候需要点击允许. 商米应用市场搜索下载搜狗输入法,并安装 安装完成后,点击桌面搜狗输入法,选择启用搜狗输入法,如图 点击启用后,在虚拟键盘中选择搜狗输入法,并 ...
- Thymeleaf 的 onclick
th:onclick="'javascript:openBox(\''+${curCabNo}+'\',\''+${box.no}+'\')'" 真的难受 ,有没有好办法!!!!
- [SQL Server] 时间处理:获取今天的00:00:00/获取今天的23:59:59
获取今天的00:00:00 SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) 获取今天的23:59:59 1.SELECT DAT ...
- 安装mysql8.0.12
安装mysql8.0.12 https://blog.csdn.net/zwj1030711290/article/details/80039780 问题1:忘记记录日志打印的密码就把窗口给关了 解决 ...
- SAM failed to write changes to the database 问题处理
问题: Windows Storage Server 2012 R2 发布NAS服务,客户创建用户和组时报错,事件查看器系统日志下报错Event ID 12288,内容如下: SAM failed t ...
- drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)
最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...
- 【java学习】实践中总结--持续更新中
目录: 一些定义 配置环境 相关语法 1.一些定义 java中DO的含义: https://blog.csdn.net/canot/article/details/51698047 DAO 中包含了各 ...