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