推荐使用此博客理解dinic算法 https://baijiahao.baidu.com/s?id=1612179096991409044&wfr=spider&for=pc
#include<bits/stdc++.h>
using namespace std;
struct oppo {
int to,nex,s;
} rod[200005];
int head[200005],tot=1,inf=10000000;
void add(int from,int to,int s) {
rod[++tot].to=to;
rod[tot].nex=head[from];
rod[tot].s=s;
head[from]=tot;
}
int n,m,S,T;
int d[10010],cur[10010];
bool bfs() {
queue< int > v;
memset(d,-1,sizeof(d));
v.push(S);
d[S]=1;
cur[S]=head[S];
while(v.size()) {
int lxl=v.front();
v.pop();
for(int i=head[lxl]; i; i=rod[i].nex) {
int to=rod[i].to;
if(rod[i].s&&d[to]==-1) {
cur[to]=head[to];
d[to]=d[lxl]+1;
v.push(to);
if(to==T)
return 1;
}
}
}
return 0;
}
int find(int x,int lomit)
{
int low=0;
if(x==T) return lomit;
for(int i=cur[x];i&&low<lomit;i=rod[i].nex)
{
cur[x]=i;
int to=rod[i].to;
if(d[to]==d[x]+1&&rod[i].s)
{
int t=find(to,min(lomit-low,rod[i].s));
if(!t) d[to]=-1;
low+=t;
rod[i].s-=t;
rod[i^1].s+=t;
}
}
return low;
}
int dinic() {
int low,ans=0;
while(bfs())
while(low=find(S,inf))
ans+=low;
return ans;
}
int main() {
cin>>n>>m>>S>>T;
for(int i=1; i<=m; i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,0);
}
cout<<dinic();
return 0;
}
推荐的博客不错