dinic+spfa#8-#11MLE警示后人
查看原帖
dinic+spfa#8-#11MLE警示后人
251449
hfjh楼主2023/1/11 22:06

在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;
}
2023/1/11 22:06
加载中...