当前位置: 首页 > news >正文

【BZOJ】1086: [SCOI2005]王室联邦

【题意】给定n个点的树,要求划分成若干大小为[B,3B]的块,满足一个块加上一个核心点后连通,求方案。n<=1000。

【算法】树分块

【题解】参考:PoPoQQQ 讲得很详细了,就不必听我口胡了。。。

树分块算法的起源?用这道题的树分块算法可以实现将一棵树划分成若干[B,3B]的块。

DFS过程中用栈记录,扫描到点x时记录top作为当前子树x的栈底(下面的点不能取)。

如果某棵子树扫描后有>=B个点,那么直接构成一块。

如果两棵子树扫描后才有>=B个点,那么这一块一定在[B,2B)之间,也构成一块。

最后剩余的点加入最后一块,至多会使最后一块变成3B。

复杂度O(n)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int n,B,first[maxn],s[maxn],st[maxn],belong[maxn],tot=0,cnt=0,ans=0,top=0;
struct edge{int v,from;}e[maxn*2];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void dfs(int x,int fa){
    int lim=top;
    for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
        dfs(e[i].v,x);
        if(top-lim>=B){
            ans++;s[ans]=x;
            while(top>lim)belong[st[top--]]=ans;
        }
    }
    st[++top]=x;
}
int main(){
    scanf("%d%d",&n,&B);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        insert(u,v);insert(v,u);
    }
    dfs(1,0);
    while(top)belong[st[top--]]=ans;
    printf("%d\n",ans);
    for(int i=1;i<=n;i++)printf("%d ",belong[i]);puts("");
    for(int i=1;i<=ans;i++)printf("%d ",s[i]);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8571337.html

相关文章:

  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • vuex入门
  • zookeeper集群的安装
  • Godot-3D教程-02.3D性能和局限性
  • markdown编写技巧
  • vuex 存值 及 取值 的操作
  • java的IO流的一些测试
  • 扒一扒,你有多少校友在阿里?实习就来阿里云。
  • LVS+keepalived+nginx
  • 0/1背包经典例题 入门动态规划
  • HDU 2242 考研路茫茫——空调教室(边双连通)
  • Inno 安装前检测.net framework 4.0
  • MySQL5.7 添加用户、删除用户与授权
  • Puppeteer:浏览器控制器
  • Centos 如何双击执行可执行程序
  • AHK 中 = 和 == 等比较运算符的用法
  • CAP理论的例子讲解
  • Hibernate【inverse和cascade属性】知识要点
  • js数组之filter
  • k个最大的数及变种小结
  • Laravel 菜鸟晋级之路
  • leetcode讲解--894. All Possible Full Binary Trees
  • Map集合、散列表、红黑树介绍
  • mongo索引构建
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Sublime Text 2/3 绑定Eclipse快捷键
  • text-decoration与color属性
  • 对JS继承的一点思考
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊sentinel的DegradeSlot
  • 你不可错过的前端面试题(一)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序设置上一页数据
  • 用element的upload组件实现多图片上传和压缩
  • 《天龙八部3D》Unity技术方案揭秘
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 第二十章:异步和文件I/O.(二十三)
  • 选择阿里云数据库HBase版十大理由
  • ​业务双活的数据切换思路设计(下)
  • #if和#ifdef区别
  • $forceUpdate()函数
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2015)JS ES6 必知的十个 特性
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (vue)页面文件上传获取:action地址
  • (二)斐波那契Fabonacci函数
  • (剑指Offer)面试题34:丑数
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)程序员技术练级攻略
  • **python多态
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CLR基本术语
  • .net core 控制台应用程序读取配置文件app.config