Pagini recente » Cod sursa (job #1543174) | Cod sursa (job #239400) | Cod sursa (job #2570568) | Cod sursa (job #2481231) | Cod sursa (job #1005568)
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#include <algorithm>
using namespace std;
const int NMAX = 1003, INFI = 2e9;
vector <int> G[NMAX];
queue <int> Q;
bitset <NMAX> nviz;
int cap[NMAX][NMAX], res[NMAX][NMAX], prev[NMAX], N;
bool BFS () {
int node;
vector <int> :: iterator i;
nviz.set ();
Q.push (1);
while (!Q.empty ()) {
node = Q.front ();
Q.pop ();
nviz[node] = 0;
if (node == N)
continue;
for (i = G[node].begin (); i != G[node].end (); ++i)
if (nviz[*i] && cap[node][*i] != res[node][*i])
prev[*i] = node,
Q.push (*i);
}
return !nviz[N];
}
int main () {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
int M, a, b, i, node, _min, max_flow = 0;
vector <int> :: iterator j;
scanf ("%d%d", &N, &M);
for (i = 1; i <= M; ++i)
scanf ("%d%d", &a, &b),
scanf ("%d", &cap[a][b]),
G[a].push_back (b),
G[b].push_back (a);
while (BFS ())
for (j = G[N].begin (); j != G[N].end (); ++j) {
if (nviz[*j] || cap[*j][N] == res[*j][N])
continue;
_min = INFI;
prev[N] = *j;
for (node = N; node != 1; node = prev[node])
_min = min (_min, cap[prev[node]][node] - res[prev[node]][node]);
for (node = N; node != 1; node = prev[node])
res[prev[node]][node] += _min,
res[node][prev[node]] -= _min;
max_flow += _min;
}
printf ("%d", max_flow);
}