Cod sursa(job #1766609)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 28 septembrie 2016 10:00:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");

const int NMAX = 1005;
const int MMAX = 5005;
const int MULT = 200010;

int N, M;

vector<int> G[NMAX];

int capac[NMAX][NMAX];
int flux[NMAX][NMAX];

bool viz[NMAX];
int recon[NMAX];

int BFSCheck () {
    memset (viz, 0, sizeof(viz));

    queue<int> Q;
    Q.push(1);
    viz[1] = 1;

    while (!Q.empty()) {
        if (Q.front() != N) {
            for (auto &it : G[Q.front()]) {
                if ( !viz[it] && capac[Q.front()][it] > flux[Q.front()][it]) {
                    Q.push(it);
                    recon[it] = Q.front();
                    viz[it] = 1;
                }
            }
        }

        Q.pop();
    }

    return viz[N];
}

int fflux () {
    int ANS = 0;
    while (BFSCheck()) {
        for (auto &it : G[N]) {
            if (viz[it] && capac[it][N] > flux[it][N]) {
                recon[N] = it;
                int add;
                add = MULT;

                for (int i = N; i != 1; i = recon[i]) {
                    add = min (add, capac[recon[i]][i] - flux[recon[i]][i]);
                }
                for (int i = N; i != 1; i = recon[i]) {
                    flux[recon[i]][i] += add;
                    flux[i][recon[i]] -= add;
                }
                ANS += add;
            }
        }
    }

    return ANS;
}

int main ()
{
    fin >> N >> M;

    for (int i = 1; i <= M; i++) {
        int x, y, c;
        fin >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        capac[x][y] = c;
    }

    fout << fflux();

    return 0;
}