ford_fulkerson

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int const maxn=10000;
int next[maxn],point[maxn],v1[maxn],cap[maxn],rev[maxn],n,m,cnt,s,t;
bool used[maxn];
void add(int u,int v,int w,int r){
next[++cnt]=point[u]; point[u]=cnt; v1[cnt]=v; cap[cnt]=w; rev[cnt]=r;}
void init(){
int a,b,c;
cnt=0;
memset(cap,0,sizeof(cap));
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c,cnt+2);
add(b,a,0,cnt);
}
}


int dfs(int v,int t,int f){
if (v==t) return f;
used[v]=1;
for (int p=point[v];p;p=next[p]){
if (!used[v1[p]]&&cap[p]>0){
int d=dfs(v1[p],t,min(f,cap[p]));
if (d>0){
cap[p]-=d;
cap[rev[p]]+=d;
return d;
}
}
}
return 0;
}


int max_flow(int s,int t){
 int flow=0;
 for (;;){
  memset(used,0,sizeof(used));
  int f=dfs(s,t,0x7fffffff);
  if (f==0) return flow;
  flow+=f;
 }
}


int main(){
init();
cout<<max_flow(s,t);
return 0;
}

你可能感兴趣的:(ford_fulkerson)