Pagini recente » Cod sursa (job #1521668) | Cod sursa (job #3158514) | Cod sursa (job #679924) | Istoria paginii runda/cnrv_oji_x/clasament | Cod sursa (job #1009541)
#include <cstdio>
#include <climits>
#include <cstring>
#include <queue>
using namespace std;
int N, M, g[1002][1002], gr[1002][1002], p[1002];
bool viz[1002];
bool bfs(int s, int t) {
memset(viz, 0, sizeof(viz));
memset(p, 0, sizeof(p));
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 s, int t) {
int u, v, max_flow = 0;
memcpy(gr, g, sizeof(g));
while (bfs(s, t)) {
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);
for(int i = 0; i < M; i++){
int x, y, z;
fscanf(in, "%d %d %d", &x, &y, &z);
g[x][y] = z;
}
fprintf(out, "%d", flux(1, N));
fclose(in), fclose(out);
}
return 0;
}