Pagini recente » Cod sursa (job #1087919) | Cod sursa (job #2809632) | Cod sursa (job #1614287) | Cod sursa (job #2856404) | Cod sursa (job #799552)
Cod sursa(job #799552)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 1010
#define INF (1 << 30)
#define pb push_back
vector<int> G[MAXN];
int C[MAXN][MAXN], F[MAXN][MAXN];
int from[MAXN], viz[MAXN];
int cd[MAXN];
int n, m;
int bfs()
{
cd[0] = 1, cd[1] = 1;
memset(viz, 0, sizeof(viz));
for (int i = 1; i <= cd[0]; ++i) {
int node = cd[i];
if (node == n)
continue;
for (int j = 0; j < G[node].size(); ++j) {
int where = G[node][j];
if (C[node][where] == F[node][where] || viz[where])
continue;
viz[where] = 1;
cd[++cd[0]] = where;
from[where] = node;
}
}
return viz[n];
}
int main()
{
FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");
fscanf(fin, "%d %d", &n, &m);
for (int i = 0; i < m; ++i) {
int x, y, cost;
fscanf(fin, "%d %d %d", &x, &y, &cost);
G[x].pb(y); G[y].pb(x);
C[x][y] += cost;
}
int flow = 0;
while (bfs())
for (int i = 0; i < G[n].size(); ++i) {
int node = G[n][i];
if (C[node][n] == F[node][n] || !viz[node])
continue;
from[n] = node;
int fmin = INF;
for (node = n; node != 1; node = from[node])
fmin = min(fmin, C[from[node]][node] - F[from[node]][node]);
if (fmin == 0)
continue;
for (node = n; node != 1; node = from[node]) {
F[from[node]][node] += fmin;
F[node][from[node]] -= fmin;
}
flow += fmin;
}
fprintf(fout, "%d\n", flow);
return 0;
}