Pagini recente » Cod sursa (job #1199488) | Cod sursa (job #2387140) | Cod sursa (job #2281449) | Cod sursa (job #1146374) | Cod sursa (job #1246636)
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 1010
using namespace std;
vector<int> v[N];
int n,i,j,m,C[N][N],F[N][N],T[N],Q[N],sol,top,bottom;
void upd();
bool BF();
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d",&i,&j);
scanf("%d",&C[i][j]);
v[i].push_back(j);
v[j].push_back(i);
}
for(;BF();)
upd();
printf("%d\n",sol);
return 0;
}
bool BF()
{
int x;
top=bottom=1;
for(i=1;i<=n;i++)T[i]=0;
T[1]=1;Q[1]=1;
for(;top>=bottom;)
{
x=Q[bottom++];
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
if(!T[*it]&&C[x][*it]-F[x][*it]>0)
{
Q[++top]=*it;
T[*it]=x;
if(*it==n)return 1;
}
}
return T[n];
}
void upd()
{
int fl=1<<30;
for(i=n,j=T[n];i!=j;i=T[i],j=T[j])
fl=min(fl,C[j][i]-F[j][i]);
sol+=fl;
for(i=n,j=T[n];i!=j;i=T[i],j=T[j])
{
F[j][i]+=fl;
F[i][j]-=fl;
}
}