Cod sursa(job #2664972)

Utilizator Vlad.Vlad Cristian Vlad. Data 29 octombrie 2020 20:35:15
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int cap[NMAX][NMAX], val[NMAX][NMAX];
int N, M;
vector<vector<int> > gr;
int d[NMAX], t[NMAX];
void read() {
    int x, y, cpy;
    fin >> N >> M;
    gr.resize(N + 1);
    for (int i = 0; i < M; ++i) {
        fin >> x >> y >> cpy;
        cap[x][y] = cpy;
        gr[x].push_back(y);
        gr[y].push_back(x);
    }

}
queue<int> q;
void BFS() {
    int node = 1;
    d[node] = true;
    q.push(node);
    while (!q.empty()) {
        node = q.front();
        q.pop();
        for (int i : gr[node]) {
            if (d[i] == false &&  val[node][i] < cap[node][i]) {
                q.push(i);
                t[i] = node;
                d[i] = true;
            }
        }
    }
}
void maxFlow() {
    bool ok = true;
    int fmin;
    while(ok) {
        memset(d, false, sizeof d);
        memset(t, 0, sizeof t);
        BFS();
        ok = false;
        fmin = 1e9;
        for (int nod = N; nod >= 1; nod = t[nod]) {
            if (nod == 1) {
                ok = true;
            }
            else {
                fmin = min(fmin, cap[t[nod]][nod] - val[t[nod]][nod]);
            }
        }
        if (ok) {
            for (int nod = N; nod > 1; nod = t[nod]) {
                val[t[nod]][nod] += fmin;
                val[nod][t[nod]] -= fmin;
            }
        }
    }
}
int main()
{
    read();
    maxFlow();
    int flow = 0;
    for (int i = 1; i <= N; ++i) {
        flow += val[i][N];
    }
    fout << flow << "\n";
    return 0;
}