Cod sursa(job #1165493)

Utilizator cbanu96Banu Cristian cbanu96 Data 2 aprilie 2014 18:47:25
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

#define FILEIN "maxflow.in"
#define FILEOUT "maxflow.out"
#define NMAX 1005

int C[NMAX][NMAX], F[NMAX][NMAX], T[NMAX], N, M;
bool Used[NMAX];
vector<int> A[NMAX];
queue<int> BFQ;

int AugPath(int node, int sink) {
    int flow = 0x3f3f3f3f;

    T[sink] = node;

    for ( int x = sink; x != 1; x = T[x]) {
        flow = min(flow, C[T[x]][x] - F[T[x]][x]);
    }

    if (flow == 0)
        return 0;

    for ( int x = sink; x != 1; x = T[x]) {
        F[T[x]][x] += flow;
        F[x][T[x]] -= flow;
    }

    return flow;
}

bool BFTree(int source, int sink) {
    memset(Used, 0, sizeof(Used));

    BFQ.push(source);
    Used[source] = 1;

    while(!BFQ.empty()) {
        int x = BFQ.front();
        BFQ.pop();

        if (x == sink)
            continue;

        for ( int i = 0; i < A[x].size(); i++ ) {
            int y = A[x][i];

            if (F[x][y] == C[x][y])
                continue;
            if (Used[y])
                continue;

            Used[y] = 1;
            BFQ.push(y);
            T[y] = x;
        }
    }

    return Used[sink];
}

int Flux(int source, int sink) {
    int flow = 0;

    while(BFTree(source, sink)) {
        for ( int i = 0; i < A[sink].size(); i++ ) {
            flow += AugPath(A[sink][i], sink);
        }
    }

    return flow;
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

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

    for ( int i = 1, x, y; i <= M; i++ ) {
        scanf("%d %d", &x, &y);
        scanf("%d", &C[x][y]);
        A[x].push_back(y);
        A[y].push_back(x);
    }

    printf("%d\n", Flux(1, N));

    return 0;
}