Cod sursa(job #629813)

Utilizator CezarMocanCezar Mocan CezarMocan Data 4 noiembrie 2011 00:17:36
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int maxN = 1010;
const int inf = 0x3f3f3f3f;

int N, M, maxflow;
int up[maxN], flow[maxN];
int C[maxN][maxN];
vector <int> G[maxN];
int Q[maxN];
bool ok;

inline void init() {
    memset(up, -1, sizeof(up));
    memset(flow, 0, sizeof(flow));
    flow[1] = inf;
}

inline int bfs() {
    int p, u, nod, fiu, i;

    p = u = 1;
    Q[1] = 1;

    while (p <= u) {
        nod = Q[p];

        for (i = 0; i < G[nod].size(); i++) {
            fiu = G[nod][i];
            if (flow[fiu] == 0 && C[nod][fiu]) {
                flow[fiu] = min(C[nod][fiu], flow[nod]);
                up[fiu] = nod;
//                fprintf(stderr, "%d %d\n", nod, fiu);
                Q[++u] = fiu;
            }

            //fprintf(stderr, "\n");

/*            if (fiu == N) {
                p = u + 1;
                break;
            }*/
        }

        ++p;
    }

//    fprintf(stderr, "%d\n", flow[N]);

    if (flow[N] == 0) {
        ok = 0;
        return 0;
    }

    ok = 1;
    int flux = flow[N];

    for (i = N; i != 1; i = up[i]) {
        C[i][up[i]] += flux;
        C[up[i]][i] -= flux;
    }

    return flux;
}

int main() {
    int i, a, b, c;
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

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

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


    ok = 1;

    while (ok) {
        init();
        ok = 0;
//        fprintf(stderr, "sula\n");
        maxflow += bfs();
    }

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

    return 0;
}