递归处理子树,把当前结点当作栈底,然后递归,回溯回来之后如果栈中结点数量到达某一个标准时,弹出栈中所有的元素分到一个块中,最后递归结束了如果栈中还有元素,那么剩下的这些元素放在新的块中

题目:BZOJ-1086

当块中元素大于B时,立即释放放入到一个新块中,省会可以直接用当前递归到的点,因为它的子节点一定是在栈中的。最后栈中剩下的部分是小于B的,所以可以直接加到上一个块中。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1010;
vector<int> G[N];
int n,B,st[N],sz = 0;
int block_cnt = 0,province[N],be[N];
void dfs(int u,int fa = -1){
int bottom = sz;//把当前结点当作栈底
for(int i = 0;i < G[u].size();i++){
int y = G[u][i];
if(y == fa)continue;
dfs(y,u);
if(sz - bottom >= B){//如果栈中元素大于B
block_cnt++;//块数++
while(sz != bottom){
be[st[sz--]] = block_cnt;
}
province[block_cnt] = u;
}
}
st[++sz] = u;//栈中加入该元素
}
int main(){
scanf("%d%d",&n,&B);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1);
while(sz)be[st[sz--]] = block_cnt;
printf("%d\n",block_cnt);
for(int i=1;i<=n;i++){
printf("%d ",be[i]);
}
puts("");
for(int i=1;i<=block_cnt;i++){
printf("%d ",province[i]);
}
puts("");
return 0;
}

最新文章

  1. 【原】js实现复制到剪贴板功能,兼容所有浏览器
  2. JQuery 判断浏览器及其版本
  3. PHOG特征
  4. MyEclipse自定义快捷键
  5. bash 常用操作
  6. 一个H5的3D滑动组件实现(兼容2D模式)
  7. 使用豆瓣的pypi源
  8. 第一次进div1了
  9. POJ 2075
  10. lintcode 中等题:N Queens N皇后问题
  11. Windows下TEX排版论文攻略—CTeX、JabRef使用心得
  12. iOS的沙箱目录和文件操作
  13. 【5】说说Laravel5的blade模板
  14. Linux学习2——文件与目录
  15. UIImageView控件
  16. 给 endv 取个好名字有赏!
  17. 201521123092《java程序设计》第九周学习总结
  18. AFNetWorking常用方法
  19. 【1】【leetcode-77】 组合
  20. android -------- 获取手机设备信息

热门文章

  1. 【剑指 Offer】10-II.青蛙跳台阶问题
  2. 基于Python实现的系统SLA可用性统计
  3. React中的合成事件
  4. powershell中的cmdlet命令
  5. 同步alv的前端显示和输出内表中的数据
  6. JVM虚拟机基础
  7. BeetleX大数据之产品分析服务
  8. h3c交换机配置ssh密码验证登录方式
  9. 手把手做一个基于vue-cli的组件库(上篇)
  10. ORM框架对比以及Mybatis配置文件详解