所谓网络流优化,就是对网络流算法进行优化
(逃)
-1优化
大概就是如果在一次bfs搜出的图中发现当前这个点啥都增广不出来,就暂时把这个点扣掉
当前弧优化
在一次bfs搜出的图中,如果某条边已经搜过,就不必再重复搜了
注意!
使用当前弧优化时,必须写成:
int dfs(int x,int lim){if(x==n||!lim) return lim;int res=0;for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||col[to]!=col[x]+1) continue;int add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;//关键在这里!!}if(!res) col[x]=-1;return res;
}
而不能把判断lim非零的条件挪到上面for里面写成~i&&lim
因为**那样会导致cur多跳一条边,而本来的那条边可能还是有余量的,导致代码效率大大降低
不信可以试试这道题
完全是0.x秒和20s+的区别