随机RE求助
  • 板块学术版
  • 楼主zmx_wzx_JY
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/11/7 10:12
  • 上次更新2023/11/5 08:40:55
查看原帖
随机RE求助
86579
zmx_wzx_JY楼主2020/11/7 10:12

最大流模板(没有任何随机化),洛谷上每次会随机 RE 一到三个点。是什么鬼东西。

#include<bits/stdc++.h>
#define int long long
inline int read(){int res=0,flag=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+c-'0';c=getchar();}return res*flag;
}using namespace std;const int N=1e4+5,M=1e5+5,inf=0x3f3f3f3f3f3f3f3f;
queue<int>q;
int fir[N],cur[N],dep[N];bool vis[N],fi;
struct edge{int nxt,to,val;}e[M<<1];
int nn,mm,ss,tt,tot=1,maxflow;
inline void add(int u,int v,int w){e[++tot]=(edge){fir[u],v,w};fir[u]=tot;}

bool bfs(){
	for(int i=1;i<=nn;++i) dep[i] = inf, cur[i] = fir[i];
	q.push(ss); dep[ss] = 0;
	while( !q.empty() ){
		int u = q.front(); q.pop(); 
		for(int i=fir[u];i;i=e[i].nxt){
			int v = e[i].to; 
			if( dep[v]==inf && e[i].val )
				dep[v] = dep[u]+1, q.push(v);
		}
	}
	return dep[tt] != inf;
} 
bool finds; 
int dfs(int u,int low){ 
	if( u==tt ) { maxflow += low; finds=1; return low;}
	int rlow = 0, used = 0;
	for(int i=cur[u];i;i=e[i].nxt){
		int v = e[ cur[u] = i ].to;
		if( dep[v] == dep[u]+1 && e[i].val )
			if( rlow = dfs(v, min(low-used,e[i].val) ) ){
				e[i].val -= rlow, e[i^1].val +=rlow;
				used += rlow; if( used==low ) break;
			}
	}
	return used;
}
int dinic(){
	while( bfs() )
		while( dfs(ss,inf/2) );
	return maxflow;
}
signed main(){
	nn = read(), mm = read(), ss = read(), tt = read();
	for(int i=1;i<=mm;++i){
		int u = read(), v = read(), w = read();
		add(u,v,w), add(v,u,0);
	}
	printf("%lld\n",dinic());
	return 0;
}
2020/11/7 10:12
加载中...