最大流之Dinic 模板
(————————————洛谷P3376)
#include<bits/stdc++.h>
#define maxn 1000005
#define inf 2147483647
using namespace std;
int n,S,T,m,num_e=1,ans;
int head[maxn],dis[maxn];
struct edge{
int to,nex,rest;
}e[maxn];
void add_edge(int x,int y,int v){
e[++num_e].to=y;e[num_e].nex=head[x];head[x]=num_e;e[num_e].rest=v;
e[++num_e].to=x;e[num_e].nex=head[y];head[y]=num_e;e[num_e].rest=0;
}
bool bfs(){
memset(dis,0,sizeof(dis));
queue<int> q;
q.push(S);
dis[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].nex){
int y=e[i].to;
if(!dis[y]&&e[i].rest) dis[y]=dis[x]+1,q.push(y);
}
}
if(dis[T]) return true;
return false;
}
int dfs(int x,int minn){
if(x==T) return minn;
int sum=0,qaq=0;
for(int i=head[x];i;i=e[i].nex){
int y=e[i].to;
if(dis[y]==dis[x]+1&&e[i].rest){
qaq=dfs(y,min(minn-sum,e[i].rest));
e[i].rest-=qaq;
e[i^1].rest+=qaq;
sum+=qaq;
if(sum==minn) return sum;
}
}
if(!sum) dis[x]=0;
return sum;
}
int dinic(){
int anss=0;
while(bfs()) anss+=dfs(S,inf);
return anss;
}
int main(){
scanf("%d%d%d%d",&n,&m,&S,&T);
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
ans=dinic();
printf("%d",ans);
return 0;
}