Pagini recente » Cod sursa (job #3279977) | Cod sursa (job #238270)
Cod sursa(job #238270)
#include <stdio.h>
#include <assert.h>
#include <vector>
using namespace std;
#define maxn 1010
#define inf 200000
int N, M;
int Drum, L;
vector <int> A[maxn];
int G[maxn];
int S[maxn], U[maxn], From[maxn];
int C[maxn][maxn];
int BFS()
{
int i, j;
Drum = 0;
memset(U, 0, sizeof(U));
memset(From, -1, sizeof(From));
L = 1;
S[L] = 1;
U[1] = 1;
for (i = 1; i <= L && !Drum; i++)
for (j=0; j<G[S[i]]; j++)
if (C[S[i]][A[S[i]][j]]>0 && !U[A[S[i]][j]])
{
S[++L] = A[S[i]][j];
From[S[L]] = S[i];
U[S[L]] = 1;
if (S[L] == N)
{
Drum = 1;
break;
}
}
if (Drum)
{
int Vmin = inf;
for (i = N; i != 1; i = From[i]) Vmin = min(Vmin, C[From[i]][i]);
for (i = N; i != 1; i = From[i])
{
C[From[i]][i] -= Vmin;
C[i][From[i]] += Vmin;
}
return Vmin;
}
return 0;
}
int Flux()
{
int rez = 0;
Drum = 1;
while (Drum) rez += BFS();
return rez;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int x, y, z, i;
scanf("%d %d ", &N, &M);
assert(1 <= N && N <= 1000);
assert(1 <= M && M <= 5000);
for (i = 1; i <= M; i++)
{
scanf("%d %d %d ", &x, &y, &z);
assert(1 <= x && x <= N);
assert(1 <= y && y <= N);
assert(1 <= z <= 110000);
assert(x != N);
assert(y != 1);
C[x][y] += z;
A[x].push_back(y);
A[y].push_back(x);
}
for (i = 1; i <= N; i++) G[i] = A[i].size();
printf("%d\n", Flux());
return 0;
}