Cod sursa(job #1009541)

Utilizator costinbanuCostin Banu costinbanu Data 13 octombrie 2013 13:32:25
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#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;
}