洛谷 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 ...
随机推荐
- 0422作业:基础(if,while)
""" 1.题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10 ...
- 我爱Java系列之《JavaEE面试宝典》---【IO流面试总结】
1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小 ...
- h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target
root:将样式绑定到根元素(html中的根元素是<html></html>) 举个栗子 :root{ background-color: yellow; } body{ ba ...
- 中文代码示例之5分钟入门TypeScript
"中文编程"知乎专栏原文 Typescript官方文档起的这个噱头名字: TypeScript in 5 minutes, 虽然光看完文章就不止5分钟...走完整个文档流水账如下( ...
- Android为TV端助力 监听APK卸载,替换,完成的广播
ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替 ...
- jar包 pom
动态的web工程tomcat 自带jar包: jstl: taglibs-standard-impl-1.2.5.jar taglibs-standard-spec-1.2.5.jar //以下是 ...
- (爬虫)requests库
一.requests库简介 urllib库和request库的作用一样,都是服务器发起请求数据,但是requests库比urllib库用起来更方便,它的接口更简单,选用哪种库看自己. 如果没有安装过这 ...
- Python 进程(一)理论部分
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行,即正在运行的程序,是系统进行资源分配和调度的基本单位,进程是对正在运行程序的一个抽象,在早期面向进程设计的计算机结构中,进程是程 ...
- Windows 10 远程连接出现函数错误 【这可能由于CredSSP加密Oracle修正】
win+R 弹出窗口输入gpedit.msc 计算机配置=>管理模板=>系统=>凭据分配=>加密Oracle修正 编辑策略设置=>已启用=>保护级别=>易受攻 ...
- R语言学习——图形初阶之折线图与图形参数控制
plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化):plot(x,y,type="b")表示将x置于横轴,y置于纵轴,绘制点集(x,y),然后使 ...