如果你MLE 21pts,并且使用了Dinic
查看原帖
如果你MLE 21pts,并且使用了Dinic
928604
Tiffake楼主2024/7/2 20:57

在 dfs 的增广中,不要忘记除了判断 dis[v]==dis[u]+w 之外,还要判断路径长度。
like this:

inline bool SPFA(){
	for(int i=1;i<=cnt*2+2;i++)d[i]=INT_MIN;
	while(q.size())q.pop();
	f&=0,d[st]=0,cur[st]=h[st],q.push(st);
	while(q.size()){
		int u=q.front();q.pop(),f[u]=0;
		for(int i=h[u];i;i=edge[i].nxt){
			int v=edge[i].to,c=edge[i].c,w=edge[i].w;
			if(c&&d[v]<d[u]+w){
				d[v]=d[u]+w,l[v]=l[u]+1,cur[v]=h[v];
				if(!f[v])q.push(v),f[v]=1;
			}
		}
	}
	return d[ed]!=INT_MIN;
}
int dfs(int u,int flow){
	if(u==ed)return flow;
	int tmp=flow;
	for(int i=cur[u];i&&tmp;i=edge[i].nxt){
		cur[u]=i;
		int v=edge[i].to,c=edge[i].c,w=edge[i].w;
		if(c&&d[v]==d[u]+w&&l[v]==l[u]+1){//Here
			int k=dfs(v,min(tmp,c));
			if(!k)d[v]=INT_MIN;
			edge[i].c-=k,edge[i^1].c+=k,tmp-=k,mx_cost+=w*k;
		}
	}
	return flow-tmp;
}
2024/7/2 20:57
加载中...