“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理。

他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市。

每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。

一个城市可以作为多个省的省会。

聪明的你快帮帮这个国王吧!

Solution

玄学构造题。

因为省会可以不再省内,所以有一种乱搞做法。

DFS这棵树,每离开一个点,就把它加入栈内,当发现栈内元素大于等于b时,就弹到当前节点,将省会设为当前节点。

当最后剩下一些点时,我们把它放到上一个省,可以保证不超界。

这样做可以保证一定存在解。

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #define N 1002
  4. using namespace std;
  5. int st[N],head[N],root[N],top,tot,n,b,num,co[N],u,v;
  6. struct zzh{
  7. int n,to;
  8. }e[N<<];
  9. inline void add(int u,int v){
  10. e[++tot].n=head[u];
  11. e[tot].to=v;
  12. head[u]=tot;
  13. }
  14. void dfs(int u,int fa){
  15. int bo=top;
  16. for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){
  17. int v=e[i].to;
  18. dfs(v,u);
  19. if(top-bo>=b){
  20. num++;
  21. while(top>bo)co[st[top--]]=num;
  22. root[num]=u;
  23. }
  24. }
  25. st[++top]=u;
  26. }
  27. int main(){
  28. scanf("%d%d",&n,&b);
  29. for(int i=;i<n;++i){
  30. scanf("%d%d",&u,&v);
  31. add(u,v);add(v,u);
  32. }
  33. dfs(,);
  34. while(top)co[st[top--]]=num;
  35. cout<<num<<endl;
  36. for(int i=;i<=n;++i)printf("%d ",co[i]);cout<<endl;
  37. for(int i=;i<=num;++i)printf("%d ",root[i]);
  38. return ;
  39. }

[SCOI2005]王室联邦(构造)的更多相关文章

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

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

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

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

  3. 1086: [SCOI2005]王室联邦

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

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

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

  5. bzoj1086 [SCOI2005]王室联邦 树分块

    [bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...

  6. Bzoj 1086: [SCOI2005]王室联邦(分块)

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...

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

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

  8. BZOJ1086: [SCOI2005]王室联邦(贪心,分块?)

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2610  Solved: 1584[Submit][Status] ...

  9. BZOJ1086 [SCOI2005]王室联邦

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

随机推荐

  1. 902. Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. You ...

  2. 过滤数组中的空数组array_filter()

    手册查询array_filter()的使用细节时,看到了:If no callback is supplied, all entries of input equal to FALSE (see co ...

  3. 二叉搜索树的第k个节点

    给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. = =一看就想到中序遍历 public class Soluti ...

  4. 用Python来操作redis 以及在Django中使用redis

    什么是Redis? Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值可以包 ...

  5. EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE

    使用 PEEWEE 断断续续的差不多已经三个年头了,但是没有像这次使用这么多的特性和功能,所以这次一并记录一下,需要注意的地方和一些使用细节,之后使用起来可能会更方便. 因为是使用的 SQLAched ...

  6. curl 命令 从文件读取参数

    -d @filename 从文件读入内容-d @- 从stdin读入内容 -x localhost:8888   加上fiddler代理 一个sample curl -K api.conf -d @b ...

  7. JAVA 变量 数据类型 运算符 知识小结

    ---------------------------------------------------> JAVA 变量 数据类型 运算符 知识小结 <------------------ ...

  8. Linux下 rewrite_mod 的配置

    以下使用最新的 Ubuntu 16.04 测试; 安装好apache后先确认有没有rewrite模块,大多数情况下是有的:ls /etc/apache2/mods-available |grep re ...

  9. ASP.NET MVC和Web API中的Angular2 - 第1部分

    下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...

  10. poj-1724(bfs+优先队列)

    题意:有向图,给你m条边,每条边有两个权值,路径长和通过这条路径的花费,问你在不超过k花费的前提下,最短的路径从1走到n 解题思路:因为边数很少,我们可以直接用暴力每条边的方式来找最小的路径长,也就是 ...