Cod sursa(job #1009520)

Utilizator costinbanuCostin Banu costinbanu Data 13 octombrie 2013 12:44:24
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#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;
}