话说……
你说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=