在dinic的dfs中,请记一个数组来标记某个点是否还在搜索栈中
代码:
错误代码:
ll dfs(int x,ll ans){
if(x==t) return ans;
ll rest=ans;
for(int i=now[x];i&&rest;i=edge[i].next){
int y=edge[i].to;
now[x]=i;
if(d[y]==d[x]+edge[i].v){
ll k=dfs(y,min(edge[i].w,rest));
if(k!=0){
edge[i].w-=k;
edge[i^1].w+=k;
rest-=k;
}
}
}
// cout<<ans<<" "<<rest<<endl;
return ans-rest;
}
正确代码(注意第三行vis[x]=1和倒数第三行的vis[x]=0和if判断中的!vis[y])
ll dfs(int x,ll ans){
if(x==t) return ans;
vis[x]=1;
ll rest=ans;
for(int i=now[x];i&&rest;i=edge[i].next){
int y=edge[i].to;
now[x]=i;
if(vis[y]) cout<<x<<" "<<y<<endl;
if(!vis[y]&&d[y]==d[x]+edge[i].v){
ll k=dfs(y,min(edge[i].w,rest));
if(k!=0){
edge[i].w-=k;
edge[i^1].w+=k;
rest-=k;
}
}
}
vis[x]=0;
return ans-rest;
}