Pagini recente » Cod sursa (job #2767163) | Cod sursa (job #952872) | Cod sursa (job #633649) | Cod sursa (job #1076201) | Cod sursa (job #1262789)
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
using namespace std;
#define NMAX 1007
vector < int > G[NMAX];
vector < int > :: iterator u;
queue < int > Q;
int total,fmin,X,node,Y,Z,N,M;
int C[NMAX][NMAX],F[NMAX][NMAX];
bool marked[NMAX];
int T[NMAX];
bool bf()
{
Q.push(1);
marked[1]=true;
int node;
memset(marked,false,sizeof(marked));
while (!Q.empty())
{
node=Q.front();
Q.pop();
if (node==N) continue;
for (u=G[node].begin();u!=G[node].end();++u)
{
if (marked[*u] || C[node][*u]==F[node][*u]) continue;
Q.push(*u);
marked[*u]=true;
T[*u]=node;
}
}
return marked[node];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
for (scanf("%d%d",&N,&M);M;--M)
{
scanf("%d%d%d",&X,&Y,&Z);
C[X][Y]+=Z;
G[X].push_back(Y);
G[Y].push_back(X);
}
while (bf())
for (u=G[N].begin();u!=G[N].end();++u)
{
if (F[*u][N]==C[*u][N] || !marked[*u]) continue;
for (node=N,T[N]=*u,fmin=INT_MAX;node!=1;node=T[node])
fmin=min(fmin,C[T[node]][node]-F[T[node]][node]);
if (!fmin) continue;
for (node=N;node!=1;node=T[node])
{
F[T[node]][node]+=fmin;
F[node][T[node]]-=fmin;
}
total+=fmin;
}
printf("%d\n",total);
return 0;
}