手工栈替代品——非递归dfsの板子

话说……

你说SDOI题毒瘤就毒瘤叭,还用的是过时的 Windows+Cena。。。
你说用Windows就用了叭,还连一个开栈语句都不给写连个O2都不给开。。
生怕选手做出题来系列
SD的小辣鸡ATP已经在SDOI2016的时候被破烂系统栈坑过一回了。。好不容易写个部分分结果爆了栈一分没有
其实ATP一开始是被安利到手工栈的但是不知道为什么当时就是不想学然后正好那一段时间在写网络流然后突然就有了根据非递归的ISAP照葫芦画瓢搞一个非递归dfs的主意。。。
于是下面的板子就新鲜出炉辣!

基于ISAP的非递归dfs

怎么样这个名字听起来是不是很高(zhuang)大(bi)上(逃

ISAP是怎么写的来着?

int ISAP(){
    int u=S;
    bool flag=false;
    //赋初值啦BFS啦之类的过程 
    while (d[S]<T){
        //如果走到了汇点就更新流量
        flag=false;
        for (int i=cur[u];i!=-1;i=e[i].nxt){
            /*更新当前弧*/
            if (d[u]==d[v]+1&&e[i].flw>0){
            /*记录找到的可以走的点同时标记flag表示找到可行路径*/
            }
        }
        if (flag==false){
  /*回溯过程*/}
    }
    return Flow;
}

可以看出来它能够以非递归替代递归的关键就是这么几点:

  • 设置了一个当前变量u指向当前操作的节点
  • 设置了一个标记flag表示当前节点还有没有可以扩展的道路
  • 设置了当前弧数组记录当前节点走到哪个位置,回溯回来的时候直接从上次搜索结束的位置开始下一步搜索
  • 有记录路径的数组方便找不到路径时回溯

那么在一般常用的树链剖分啦dfs序啦这些东西里面是不是也可以设置类似的东西呢?显然在树上的话每次回溯是蹦到当前节点的father的,那么只需要对每个节点记录father就可以实现回溯了。剩下的都是和ISAP差不多的啦。

首先贴一个树链剖分两次dfs预处理好像还附带着dfs序的板子:


void dfs(){
    int u=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值