优化
1、当前弧优化
for(int i = now[x];i && sum;i = edge[i].next){
now[x] = i;
...
}
2、如果一个点被搜过并且没有剩余流量的,那就一定不再搜这个点了
if(!k) d[y] = inf;
3、判断sum是否为0,为0就不继续搜了
for(int i = now[x];i && sum;i = edge[i].next){
4、是否在搜索栈的优化
在dinic的dfs中,请记一个数组来标记某个点是否还在搜索栈中
全部代码:
int dfs(int x,int sum){//sum指进入,res代表需要
if(x == t) return sum;
int res = 0;
vis[x] = 1;//优化4
for(int i = now[x];i && sum;i = edge[i].next){//优化1、3
now[x] = i;//优化1
int y = edge[i].to;
if(!vis[y] && d[y] == d[x] + 1 && edge[i].w){
int k = dfs(y,min(sum,edge[i].w));
if(!k) d[y] = inf;//优化2
edge[i].w -= k;
edge[i ^ 1].w += k;
sum -= k;
res += k;
}
}
vis[x] = 0;//优化4
return res;
}