Cod sursa(job #1044311)

Utilizator costinbanuCostin Banu costinbanu Data 29 noiembrie 2013 16:42:16
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

const int NN = 1024;

int cap[NN][NN], viz[NN], prev[NN];
vector<int> vec[NN];

void BFS(int nod){
    if (!viz[nod]){
        //printf("%d ", nod);
        viz[nod] = 1;
        for(int i = 0; i < vec[nod].size(); i++){
            if (cap[nod][vec[nod][i]] && prev[vec[nod][i]] == -1)
                prev[vec[nod][i]] = nod,
                BFS(vec[nod][i]);
        }
    }
}

int dinic(int n, int s, int t) {
    int /*q[NN], prev[NN],*/ flow = 0;
    while ( 1 ) {
        memset(prev, -1, sizeof(prev));
        memset(viz, 0, sizeof(viz));
        /*int qf = 0, qb = 0;
        q[qb++] = s;
        prev[s] = -2;
        while (qb > qf && prev[t] == -1)
            for (int u = q[qf++], i = 0, v; i < vec[u].size(); i++) {
                v = vec[u][i];
                if (prev[vec[u][i]] == -1 && cap[u][v])
                   q[qb++] = v, prev[v] = u;
            }
        printf("\nq: ");
        for(int i = 0; i < qb; i++)
            printf("%d ", q[i]);*/
        prev[s] = -2;
        BFS(1);
        /*printf("\nprev: ");
        for(int i = 1; i <= n; i++)
            printf("%d ", prev[i]);*/
        if (prev[t] == -1) break;
        for (int z = 1; z <= n; z++)
            if (cap[z][t] && prev[z] != -1) {
                int capmin = cap[z][t];
                for (int v = z, u = prev[v]; u >= 0; v = u, u = prev[v])
                    capmin  = min(capmin, cap[u][v]);
                if (!capmin) continue;
                cap[z][t] -= capmin, cap[t][z] += capmin;
                for (int v = z, u = prev[v]; u >= 0; v = u, u = prev[v])
                    cap[u][v] -= capmin,  cap[v][u] += capmin;
                flow += capmin;
            }
    }
    return flow;
}

int main() {
    FILE *in = fopen("maxflow.in", "r"), *out = fopen("maxflow.out", "w");
    if (in && out){
        int n, s, t, m, u, v, c;
        fscanf(in, "%d %d", &n, &m);
        s = 1, t = n;
        for(int i = 0; i < m; i++) {
            fscanf(in, "%d %d %d", &u, &v, &c);
            cap[u][v] += c;
            vec[u].push_back(v);
            vec[v].push_back(u);
        }
        //BFS(1);
        printf("\n\n");
        //for(int i = 1; i <= n; i++) printf("%d ", pred[i]);
        fprintf(out, "%d\n", dinic(n, s, t));
        fclose(in), fclose(out);
    }
    return 0;
}