P2325 [SCOI2005]王室联邦 解题报告
P2325 [SCOI2005]王室联邦
题目描述
“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理。
他的国家有\(n\)个城市,编号为\(1\dots n\)。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。为了防止管理太过分散,每个省至少要有\(B\)个城市,为了能有效的管理,每个省最多只有\(3B\)个城市。
每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。
一个城市可以作为多个省的省会。
聪明的你快帮帮这个国王吧!
输入输出格式
输入格式:
第一行包含两个数\(N\),\(B\)(\(1\le N\le 1000, 1\le B \le N\))。接下来\(N-1\)行,每行描述一条边,包含两个数,即这条边连接的两个城市的编号。
输出格式:
如果无法满足国王的要求,输出\(0\)。
否则第一行输出数\(K\),表示你给出的划分方案中省的个数,编号为\(1\dots K\)。
第二行输出\(N\)个数,第\(i\)个数表示编号为\(i\)的城市属于的省的编号。
第三行输出\(K\)个数,表示这\(K\)个省的省会的城市编号,如果有多种方案,你可以输出任意一种。
这里扔一个偷来的图片,顺便问下这是哪个ppt呀
一种树分块的方法...我还不知道这东西的实际意义
记录当前点的栈顶,然后每遍历完一个儿子,如果栈顶-记录点的个数大于\(B\),就以这个点为首都扔出来,最后把这个点加进去。
如果最后有剩,放到最后一个点形成的首都里就行了,可以证明不超过\(3B\)
Code:
#include <cstdio>
const int N=1e3+10;
int head[N],to[N<<1],Next[N<<1],cnt;
int n,B,s[N],rt[N],bel[N],tot,top;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
void dfs(int now,int fa)
{
int bot=top;
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=fa)
{
dfs(v,now);
if(top-bot>=B)
{
rt[++tot]=now;
while(top!=bot) bel[s[top--]]=tot;
}
}
s[++top]=now;
}
int main()
{
scanf("%d%d",&n,&B);
for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(1,0);
while(top) bel[s[top--]]=tot;
printf("%d\n",tot);
for(int i=1;i<=n;i++) printf("%d ",bel[i]);
puts("");
for(int i=1;i<=tot;i++) printf("%d ",rt[i]);
return 0;
}
2019.1.6
P2325 [SCOI2005]王室联邦 解题报告的更多相关文章
- 洛谷P2325 [SCOI2005]王室联邦
P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市, ...
- P2325 [SCOI2005]王室联邦
题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间 ...
- 洛谷 P2325 [SCOI2005]王室联邦
简化版题意: 一个国家由\(n\)个城市组成一颗树,要将其划分为\(n\)个省 每个城市大小为\([B,3B]\),每个省有一个省会(不一定要在省内),使得每个省的所有城市到省会的路径上不能经过其他省 ...
- 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: ...
- bzoj1086 [SCOI2005]王室联邦 树分块
[bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...
- Bzoj 1086: [SCOI2005]王室联邦(分块)
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...
随机推荐
- maven使用出现的错误
修改mvn archetype:create 改成mvn archetype:generate 刚开始学习用Maven, 装好了以后生成一个新的project mvnarchetype:genera ...
- ISCSI target的两种安装方法
1 tgt程序架构 tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便 ...
- 基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程
基于多进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控和管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发 ...
- 20155220 《网络对抗》Exp 8 Web基础
20155220 <网络对抗>Exp 8 Web基础 基础问题回答 实践内容 1.Web前端HTML 配置环境 正常安装.启动Apache 安装:sudo apt-get install ...
- 20155320《网络对抗》Exp2 后门原理与实践
20155320<网络对抗>Exp2 后门原理与实践 [实验内容] (3.5分) (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- mfc 动态为控件添加事件2
重载窗口过程 为动态控件绑定事件 一.重载窗口过程处理函数 CWnd::WindowProc virtual LRESULT WindowProc( UINT message, WPARAM wPar ...
- cocos2d-x学习记录2——CCAction动作
CCAction能够使CCNode运动起来,能够呈现出多种多样的动作.这些动作能够改变其运动方向.形状.大小.旋转等. 同时,还可利用CCCallFunc.CCCallFuncN.CCCallFunc ...
- [JOI2017春季合宿]Port Facility[set、二分图]
题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...
- NetBeans 插件开发简介
希望 NetBeans 为您提供更多功能吗? 您希望倾心投入到 NetBeans 的开发中,并希望它能激发您开发另一个应用程序的热情.您希望聆听音乐.浏览网页.查看邮件.存储喜欢的 URL,以及维护日 ...