洛谷 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 ...
随机推荐
- 80后程序员降薪6K,预感中年危机来袭,准备跳槽却碰壁
一提及程序员,很多人想到的都是“工资高”“技术好”诸如此类的,可见程序员是个非常赚钱的职业,所以每年都会有很多毕业生来选择这个行业. 但是社会是公平的,不要只看程序员表面上的光鲜亮丽,其背后也有很多的 ...
- python迭代器与生成器及yield
一.迭代器(itertor) 1.可迭代: 在Python中如果一个对象有__iter__()方法或__getitem__()方法,则称这个对象是可迭代的(iterable). 其中__iter__( ...
- spring javaconfig druidsource
package dataConfig; import java.sql.SQLException; import org.springframework.context.annotation.Bean ...
- react native中一次错误排查 Error:Error: Duplicate resources
最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错“Error:Error: Duplicate ...
- Linux安装配置Mariadb
一.安装数据库Mariadb 参考:http://blog.51cto.com/12173069/2047746 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自 ...
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
- Linux学习历程——Centos 7 chmod命令
一.命令介绍 chmod 命令,是Linux管理员最常用的命令之一,用于修改文件或目录的访问权限. Linux系统中,每一个文件都有文件所有者和所属群组,并且规定文件的所有者,所属群组,以及其他人队问 ...
- MySql 触发器的新增、修改、删除的创建
MySql 触发器与SQL server 触发器不同: SQL Server 使用 inserted.deleted 代表被触发的数据. MySQL NEW代表触发后的新数据行,Old代表当前触发 ...
- export,export default和import的区别以及用法
首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和import export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口 ...
- AI移动自动化测试框架设计(解读)
声明:原文出自"前端之巅"微信公众号"爱奇艺基于AI的移动端自动化测试框架的设计"一文,作者:何梁伟,爱奇艺Android架构师.文章提供了一种基于AI算法的自 ...