题目见USACO草地排水一题
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<set>
#include<stack>
#include<map>
#include<bitset>
#include<ctime>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read()
{
char k=0;char ls;ls=getchar();for(;ls<'0'||ls>'9';k=ls,ls=getchar());
ll x=0;for(;ls>='0'&&ls<='9';ls=getchar())x=x*10+ls-'0';
if(k=='-')x=0-x;return x;
}
ll n,m;
struct E
{
ll edge;
ll zhi;
ll s;
}a[3000];
ll last[3000];
ll back;
ll ans;
ll pre[3000];
ll prn[3000];
inline void Edmonds_karp()
{
while(1)
{
queue<ll>p;
ll minflow=INT_MAX;
p.push(1);
memset(pre,0,sizeof(pre));
memset(prn,0,sizeof(prn));
while(!p.empty())
{
int u=p.front();
p.pop();
if(u==n)break;
for(int j=last[u];j;j=a[j].zhi)
{
if(a[j].s>0&&prn[a[j].edge]==0)
{
pre[a[j].edge]=j;
prn[a[j].edge]=u;
p.push(a[j].edge);
}
}
}
if(prn[n]==0)break;
for(int i=n;i!=1;i=prn[i])
minflow=min(minflow,a[pre[i]].s);
for(int i=n;i!=1;i=prn[i])
{
ll q=pre[i];
a[q].s-=minflow;
a[q^1].s+=minflow;
}
ans+=minflow;
}
}
int main()
{
m=read();n=read();
for(int i=1;i<=m;++i)
{
ll a1=read(),b1=read(),c1=read();
a[++back].edge=b1;
a[back].zhi=last[a1];
a[back].s=c1;
last[a1]=back;
a[++back].edge=a1;
a[back].zhi=last[b1];
a[back].s=0;
last[b1]=back;
}
Edmonds_karp();
cout<<ans<<endl;
return 0;
}