Pagini recente » Cod sursa (job #2296848) | Cod sursa (job #2542720) | Cod sursa (job #2467972) | Cod sursa (job #1016334) | Cod sursa (job #1009520)
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
int N, M, **g;
bool bfs(int **gr, int s, int t, int *p) {
bool * viz = (bool *) calloc(N + 1, sizeof(bool));
queue <int> q;
q.push(s);
viz[s] = true;
p[s] = -1;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 1; v <= N; v++) {
if (viz[v] == false && gr[u][v] > 0) {
q.push(v);
p[v] = u;
viz[v] = true;
}
}
}
return (viz[t] == true);
}
int flux(int **g, int s, int t) {
int u, v, max_flow = 0,
**gr = (int **) calloc(N + 1, sizeof(int *)),
*p = (int *) calloc(N + 1, sizeof(int));
memcpy(gr, g, N * N * sizeof(int));
while (bfs(gr, s, t, p)) {
int path_flow = INT_MAX;
for (v = t; v != s; v = p[v]) {
u = p[v];
path_flow = min(path_flow, gr[u][v]);
}
for (v = t; v != s; v = p[v]) {
u = p[v];
gr[u][v] -= path_flow;
gr[v][u] += path_flow;
}
max_flow += path_flow;
}
return max_flow;
}
int main() {
FILE *in = fopen("maxflow.in", "r"), *out = fopen("maxflow.out", "w");
if (in && out) {
fscanf(in, "%d %d\n", &N, &M);
g = (int **) calloc(N + 1, sizeof(int *));
for(int i = 0; i <= N; i++)
g[i] = (int *) calloc(N + 1, sizeof(int));
for(int i = 0; i < M; i++){
int x, y, z;
fscanf(in, "%d %d %d", &x, &y, &z);
g[x][y] = g[y][x] = z;
}
int rez = flux(g, 1, N);
fprintf(out, "%d", rez);
fclose(in), fclose(out);
}
return 0;
}