简化版题意:

一个国家由\(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]王室联邦的更多相关文章

  1. 洛谷P2325 [SCOI2005]王室联邦

    P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市, ...

  2. 洛谷.2325.[SCOI2005]王室联邦(贪心)

    题目链接 比较水的题 然而.. 首先可以考虑DFS 每B个分一个块,但是这样链底不会和上边相连 于是考虑从底下开始分,即在DFS完一个点时才将其加入栈中:当子树size==B时出栈 最后在根节点可能会 ...

  3. P2325 [SCOI2005]王室联邦 解题报告

    P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有\(n\) ...

  4. P2325 [SCOI2005]王室联邦

    题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间 ...

  5. luogu P2325 [SCOI2005]王室联邦

    传送门 做法是dfs整棵树,当访问一个点\(x\)时,先访问儿子,若某个时刻子树大小\(\ge b\)时,就把那些点放在一个省里,省会记为\(x\),访问完儿子再把\(x\)加入栈.最后栈中剩余的没加 ...

  6. BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1399  Solved: ...

  7. 【块状树】BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 826  Solved:  ...

  8. 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1554  Solved: ...

  9. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

随机推荐

  1. 2.python中self详解(程序适用于python3版本)

    先介绍下Python中的类和实例面向对象最重要的概念就是类(class)和实例(instance),类(class)是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示.而实例是根据 ...

  2. 折腾Java设计模式之迭代器模式

    迭代器模式 Provide a way to access the elements of an aggregate object sequentially without exposing its ...

  3. tablednd onDrap 方法不调用

    场景 使用 tablednd 插件时,onDrap 方法不调用 解决 给tr标签加 id 属性

  4. 2018-07-10 为Chrome和火狐浏览器编写扩展

    由于扩展标准的逐渐一致, 现在同一扩展代码库已经有可能同时用于Chrome和火狐. 下面是一个简单的工具栏按钮和弹窗(尚无任何实际功能): 代码库地址: nobodxbodon/suan1 所有代码: ...

  5. vue框架入门和ES6介绍

    vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...

  6. Eclipse 模板

    Eclipse 的模板:推荐一个好的内容 设置注释模板的入口:Window->Preference->Java->Code Style->Code Template 然后展开C ...

  7. 初步了解PE分析

    尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...

  8. python接口自动化-json数据处理

    前言 有些post的请求参数是json格式的,需要导入json模块进行处理,json是一种数据交换格式,独立于编程语言 一般常见的接口返回数据也是json格式的,我们在做判断的时候,往往只需要提取其中 ...

  9. MyCP(课下作业)

    一.作业要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内 ...

  10. cordova插件汇总

    1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...