Pagini recente » Cod sursa (job #2819022) | Cod sursa (job #356815) | Cod sursa (job #340468) | Cod sursa (job #2902635) | Cod sursa (job #583222)
Cod sursa(job #583222)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
#define MAXN 1010
#define INF 0x3f3f3f3f
#define max(a, b) (((a) < (b)) ? (a) : (b))
vector <int> g[MAXN];
typedef vector <int>::iterator iter;
int cap[MAXN][MAXN], f[MAXN][MAXN], lst[MAXN * MAXN], t[MAXN], flow, n;
bitset <MAXN> viz;
fstream fin ("maxflow.in", ios::in);
fstream fout ("maxflow.out", ios::out);
bool bfs ()
{
viz.reset ();
lst[0] = 1;
viz[1] = true;
for (int i = 0, len = 1, nd; i < len; ++i) {
if (lst[i] != n) {
nd = lst[i];
for (iter it = g[nd].begin (); it != g[nd].end (); ++it) {
if (cap[nd][*it] != f[nd][*it] && !viz[*it]) {
viz[*it] = true;
t[*it] = nd;
lst[len++] = *it;
}
}
}
}
return viz[n];
}
int main ()
{
int m;
fin >> n >> m;
for (int i = 1, x, y, c; i <= m; ++i) {
fin >> x >> y >> c;
cap[x][y] += c;
g[x].push_back (y);
g[y].push_back (x);
}
while (bfs ()) {
for (iter it = g[n].begin (); it != g[n].end (); ++it) {
if (cap[*it][n] != f[*it][n] && viz[*it]) {
t[n] = *it;
int fmin = INF;
for (int i = n; i != 1; i = t[i]) {
fmin = min(fmin, cap[t[i]][i] - f[t[i]][i]);
}
if (fmin) {
for (int i = n; i != 1; i = t[i]) {
f[t[i]][i] += fmin;
f[i][t[i]] -= fmin;
}
flow += fmin;
}
}
}
}
fout << flow;
fin.close ();
fout.close ();
return 0;
}