Cod sursa(job #879560)

Utilizator savimSerban Andrei Stan savim Data 15 februarie 2013 17:15:33
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX_N = 1010;

int N, M;

int C[MAX_N][MAX_N], F[MAX_N][MAX_N];

int tata[MAX_N], use[MAX_N];

vector <int> Q;

vector <int> G[MAX_N];

int bfs() {
    memset(tata, 0, sizeof(tata));
    memset(use, 0, sizeof(use));

    Q.clear();
    Q.push_back(1);
    use[1] = 1;

    for (;;) {
        int DIM = Q.size();
        int pos = rand() % DIM;

        int nod = Q[pos];
        swap(Q[pos], Q[DIM - 1]);
        Q.pop_back();

        for (vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
            if (use[*it] == 0 && C[nod][*it] - F[nod][*it] > 0) {
                tata[*it] = nod;
                use[*it] = 1;
                Q.push_back(*it);
            }

        if (use[N])
            break;
        if (Q.size() == 0)
            break;
    }

    int vmin = 1e+9;
    for (int i = N; tata[i] > 0; i = tata[i])
        vmin = min(vmin, C[tata[i]][i] - F[tata[i]][i]);
    if (vmin == 1e+9)
        vmin = 0;

    for (int i = N; tata[i] > 0; i = tata[i]) {
        F[tata[i]][i] += vmin;
        F[i][tata[i]] -= vmin;
    }

    return vmin;
}

int main() {

    srand(time(NULL));

    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    scanf("%d %d", &N, &M);

    for (int i = 1; i <= M; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(b);
        G[b].push_back(a);

        C[a][b] = c;
    }

    int flow = 0;

    for (;;) {
        int add = bfs();
        if (add == 0)
            break;
        else
            flow += add;
    }

    printf("%d\n", flow);

    return 0;
}