Pagini recente » Cod sursa (job #2437204) | Cod sursa (job #1081182) | Cod sursa (job #2732582) | Cod sursa (job #280921) | Cod sursa (job #1379650)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int n,m,C[1005][1005],F[1005][1005],flow,q[1005],TT[1005];
bool used[1005];
vector <int> G[1005];
#define pb push_back
bool BFS()
{
q[0]=q[1]=1;
memset(used,false,sizeof(used));
used[1]=true;
for (int i=1;i<=q[0];i++)
{
int nod=q[i];
if (nod==n) continue;
for (vector<int>::iterator it=G[nod].begin();it!=G[nod].end();it++)
{
int V=*it;
if (C[nod][V]==F[nod][V] || used[V]) continue;
used[V]=true;
q[++q[0]]=V;
TT[V]=nod;
}
}
return used[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y,z;
while (m--)
{
scanf("%d %d %d",&x,&y,&z);
G[x].pb(y);
G[y].pb(x);
C[x][y]+=z;
}
int fmin;
for (flow=0;BFS();)
{
for (vector<int>::iterator it=G[n].begin();it!=G[n].end();it++)
{
int nod=*it;
if (F[nod][n]==C[nod][n] || !used[nod]) continue;
TT[n]=nod;
fmin=0x3f3f3f3f;
for (nod=n;nod!=1;nod=TT[nod])
fmin=min(fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
if (fmin==0) continue;
for (nod=n;nod!=1;nod=TT[nod])
{
F[TT[nod]][nod]+=fmin;
F[nod][TT[nod]]-=fmin;
}
flow+=fmin;
}
}
printf("%d",flow);
return 0;
}