最大流EK算法代码实现笔记
EK
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=20010,INF=1e8;
int h[N],e[M],f[M],ne[M],idx;
int S,T,n,m;
int d[N],q[N],pre[N];
bool st[N];
void add_edge(int u,int v,int c){
e[idx]=v,f[idx]=c,ne[idx]=h[u],h[u]=idx++;
e[idx]=u,f[idx]=0,ne[idx]=h[v],h[v]=idx++;
}
bool bfs(){
int hh=0,tt=0;
memset(st,0,sizeof st);
q[0]=S,d[S]=INF,st[S]=1;
while(hh<=tt){
int now=q[hh++];
for(int i=h[now];~i;i=ne[i]){
int ver=e[i];
if(!st[ver]&&f[i]){
st[ver]=1;
d[ver]=min(f[i],d[now]);
pre[ver]=i;
if(ver==T)return true;
q[++tt]=ver;
}
}
}
return false;
}
int EK(){
int res=0;
while(bfs()){
res+=d[T];
for(int i=T;i!=S;i=e[pre[i]^1])
f[pre[i]]-=d[T],f[pre[i]^1]+=d[T];
}
return res;
}
int main(){
scanf("%d%d%d%d",&n,&m,&S,&T);
for(int i=1;i<=m;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
add_edge(u,v,c);
}
printf("%d\n",EK());
return 0;
}