博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爆栈的处理方法
阅读量:6720 次
发布时间:2019-06-25

本文共 739 字,大约阅读时间需要 2 分钟。

爆栈指递归中,存储的信息量大于系统栈的内存。

信息量包括元素编号,每一层中开的变量。

和递归的层数正相关。

(虽然noip一般开栈)

1.手写栈

while(top){

  int x=sta[top];

  for(each son)

  if(has son){

    //blablabla

    sta[++top]=son;

    hd[x]=e[i].nxt;

  }

  else{

    //blablabla

    sta[top--]=0;

  }

}

可以用一个弧优化,使得每次儿子回溯后,父亲往下的边的访问直接继续。

这样复杂度就对了。

如果son回溯后,在到下一个son之前,还要做一些事情,那就用个pair,结构体什么的,讨论一下情况即可。

 

 

2.bfs序求dfs序

相同点:

先出来father的编号再出来son的编号。根节点都是1号。

区别:子树连续访问pk儿子连续访问。

联系:就差一个size

bfs求bfs序,再倒序记录每个点的size

然后,遍历bfs序。

这时x的fa一定已经求出了dfs序。

如果上一个点的fa和这个点的fa不同,那么x一定是x的fa的第一个儿子,到了fa之后就先访问x。dfn[x]=dfn[fa[x]]+1

如果上一个点的fa和这个点的fa相同,那么x一定是上一个点的后兄弟。dfn[x]=dfn[las]+size[las]

理解就是,dfs时会先遍历las的整个子树。并且下一个就一定是x了。

 

3.本地手动开栈:

#pragma GCC ("-W1,--stack=128000000)手动开栈。

 

转载于:https://www.cnblogs.com/Miracevin/p/9828971.html

你可能感兴趣的文章
一个好的icon下载网站
查看>>
C++中的substr()
查看>>
【C语言】球体从100米下落问题
查看>>
(问题解决篇)ubuntu更新时,出现错误E: Some index files failed to download。。。
查看>>
Linux学习之路
查看>>
笔记七
查看>>
vsftpd
查看>>
零基础如何学习Python编程
查看>>
gallery长按监听
查看>>
创建swap分区脚本
查看>>
CI框架获取post和get参数 CodeIgniter
查看>>
VRRP虚拟冗余路由协议配置实验:
查看>>
Hanlp在ubuntu中的使用方法介绍
查看>>
阿里分布式事务框架GTS开源啦!
查看>>
论router-on-a-stick和VLAN-IF
查看>>
网络分流器-网络分流器-5G的关键技术第一篇
查看>>
区块链之Hyperledger(超级账本)Fabric v1.0 的环境搭建(超详细教程)
查看>>
大快搜索数据爬虫技术实例安装教学篇
查看>>
Navicat使用教程:从MySQL中的多个表和视图中获取行计数(第3部分)
查看>>
进程和计划任务
查看>>