萌新求助EK,T了两个点
查看原帖
萌新求助EK,T了两个点
51061
幻离ian楼主2021/7/8 17:23
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
int INF=1ll<<62;
int n,m,s,t,res,tot,pre[205],vis[205],u,v,c;
int f[205][205];
inline int bfs(){
	memset(vis,0,sizeof(vis));
	pre[t]=0;
	queue<int>q;
	q.push(s);
	vis[s]=1;
	int lf=INF;
	while(!q.empty()){
		int x = q.front();q.pop();
		if(x==t)break;
		for(int i = 1;i<=n;i++){
			if(vis[i]==0&&f[x][i]>0){
				q.push(i);
				lf=min(lf,f[x][i]);
				pre[i]=x;
				vis[i]=1;
			}
		}
	}
	if(pre[t]==0)return 0;
	return lf; 
}
inline void upt(int flow){
	int x=t;
	while(x!=s){
		f[pre[x]][x]-=flow;
		f[x][pre[x]]+=flow;
		x=pre[x];
	}
}
signed main(){
	cin>>n>>m>>s>>t;
	for(int i = 1;i<=m;i++){
		cin>>u>>v>>c;
		f[u][v]+=c;
	}
	while(1){
		res=bfs();
		if(res==0)break;
		upt(res);
		tot+=res;
	}
	cout<<tot;
	return 0;
}
2021/7/8 17:23
加载中...