Cod sursa(job #2568701)

Utilizator catalintermureTermure Catalin catalintermure Data 4 martie 2020 09:32:10
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

ifstream inf("maxflow.in");
ofstream outf("maxflow.out");

const int NMAX = 1000;

vector<int> ad[NMAX];
int cap[NMAX][NMAX];
int flow[NMAX][NMAX];
int lvl[NMAX];
int n;

bool BFS(int d) {
    int x;
    queue<int> q;
    q.push(0);
    memset(lvl, 0xff, sizeof(lvl));
    lvl[0] = 0;
    while(!q.empty()) {
        x = q.front();
        q.pop();
        for(int el : ad[x]) {
            if(lvl[el] < 0 && cap[x][el] > flow[x][el]) {
                lvl[el] = lvl[x] + 1;
                q.push(el);
            }
        }
    }

    return lvl[d] != -1;
}

int DFS(int x, int flux) {
    if(x == n - 1) {
        return flux;
    }
    for(int el : ad[x]) {
        if(lvl[el] == lvl[x] + 1 && flow[x][el] < cap[x][el]) {
            int fmin = DFS(el, min(cap[x][el] - flow[x][el], flux));
            if(fmin > 0) {
                flow[x][el] += fmin;
                flow[el][x] -= fmin;
                return fmin;
            }
        }
    }
    return 0;
}

int main() {
    int m, x, y, c;
    inf >> n >> m;
    for(int i = 0; i < m; i++) {
        inf >> x >> y >> c;
        x--;
        y--;
        if(!cap[x][y] && !cap[y][x]) {
            ad[x].push_back(y);
            ad[y].push_back(x);
        }
        cap[x][y] += c;
    }
    int ftot = 0;
    while(BFS(n - 1)) {
        while(int flux = DFS(0, 0x3f3f3f3f)) {
            ftot += flux;
        }
    }
    outf << ftot;
    return 0;
}