Pagini recente » Cod sursa (job #2163558) | Cod sursa (job #1498519) | Cod sursa (job #2375176) | Cod sursa (job #992170) | Cod sursa (job #446737)
Cod sursa(job #446737)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define INF 0x40000000
using namespace std;
vector<int> E[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], n, m, p[NMAX];
bool viz[NMAX];
queue<int> Q;
bool bfs()
{
int nod;
memset(viz, 0, sizeof(viz));
Q.push(1);
for (; !Q.empty(); Q.pop())
{
nod = Q.front();
viz[nod] = true;
if (nod == n) continue;
for (vector<int>::iterator it = E[nod].begin(); it != E[nod].end(); ++it)
if (C[nod][*it] != F[nod][*it] && !viz[*it])
{
Q.push(*it);
p[*it] = nod;
}
}
while (!Q.empty()) Q.pop();
return viz[n];
}
int main()
{
int x, y, c, flow, nod, delta;
FILE *fin = freopen("maxflow.in", "r", stdin), *fout = freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for (; m; --m)
{
scanf("%d %d %d", &x, &y, &c);
E[x].push_back(y);
E[y].push_back(x);
C[x][y] += c;
}
for (flow = 0; bfs();)
for (vector<int>::iterator it = E[n].begin(); it != E[n].end(); ++it)
{
nod = *it;
if (F[nod][n] == C[nod][n] || !viz[nod]) continue;
p[n] = nod;
delta = INF;
for (nod = n; nod - 1; nod = p[nod])
delta = min(delta, C[p[nod]][nod] - F[p[nod]][nod]);
for (nod = n; nod - 1; nod = p[nod])
{
F[p[nod]][nod] += delta;
F[nod][p[nod]] -= delta;
}
flow += delta;
}
printf("%d\n", flow);
return 0;
}