Pagini recente » Cod sursa (job #1294338) | Cod sursa (job #1032112) | Cod sursa (job #893386) | Cod sursa (job #878991) | Cod sursa (job #742467)
Cod sursa(job #742467)
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define MAXN 1010
#define INF 1000000
vector<int> g[MAXN];
int n, m, c[MAXN][MAXN], f[MAXN][MAXN], viz[MAXN], cd[MAXN], TT[MAXN];
int BFS() {
int nod, i, j, v;
cd[cd[0] = 1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (i = 1; i <= cd[0]; ++i) {
nod = cd[i];
if (nod == n)
continue;
for (j = 0; j < g[nod].size(); ++j) {
v = g[nod][j];
if (f[nod][v] == c[nod][v] || viz[v])
continue;
TT[v] = nod;
cd[++cd[0]] = v;
viz[v] = 1;
}
}
return viz[n];
}
int main() {
int i, j, v, nod, flow = 0, fmin, x, y, cost;
fin >> n >> m;
for (i = 1; i <= m; ++i) {
fin >> x >> y >> cost;
g[x].push_back(y);
g[y].push_back(x);
c[x][y] = cost;
}
while (BFS()) {
for (i = 0; i < g[n].size(); ++i) {
v = g[n][i];
fmin = INF;
if (c[v][n] == f[v][n] || !viz[v])
continue;
TT[n] = v;
for (nod = n; nod != 1; nod = TT[nod])
fmin = min(fmin, c[ TT[nod] ][nod] - f[ TT[nod] ][nod]);
for (nod = n; nod != 1; nod = TT[nod]) {
f[TT[nod]][nod] += fmin;
f[nod][TT[nod]] -= fmin;
}
flow += fmin;
}
}
fout << flow << "\n";
fout.close();
return 0;
}