Cod sursa(job #2669350)

Utilizator Vlad.Vlad Cristian Vlad. Data 6 noiembrie 2020 19:52:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <iostream>
#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 t[NMAX];
bool d[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;
bool BFS() {
    memset(d, false, sizeof d);
    int node = 1;
    d[node] = true;
    q.push(node);
    while (!q.empty()) {
        node = q.front();
        q.pop();
        if (node != N) {
            for (int i : gr[node]) {
                if (d[i] == false &&  val[node][i] < cap[node][i]) {
                    q.push(i);
                    t[i] = node;
                    d[i] = true;
                }
            }
        }
    }
    return d[N];
}
void maxFlow() {
    int fmin;
    while(BFS()) {
        for (int nod : gr[N]) {
            if (d[nod] && val[nod][N] < cap[nod][N]) {
                fmin = 1e9;
                t[N] = nod;
                for (int nod = N; nod > 1; nod = t[nod]) {
                    fmin = min(fmin, cap[t[nod]][nod] - val[t[nod]][nod]);
                }
                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;
}