Cod sursa(job #1598765)

Utilizator assa98Andrei Stanciu assa98 Data 13 februarie 2016 12:19:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

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

const int MAX_N = 1010;
const int INF = 1000000000;

int c[MAX_N][MAX_N];
int f[MAX_N][MAX_N];

int n, m, S, D;

vector<int> A[MAX_N];

int h[MAX_N];
int e[MAX_N]; //excess
bool inq[MAX_N];

queue<int> Q;


void push(int s, int d) {
    int val =  min(c[s][d] - f[s][d], e[s]);
    e[d] += val;
    e[s] -= val;
    f[s][d] += val;
    f[d][s] -= val;
    if(!inq[d]) {
        Q.push(d);
        inq[d] = true;
    }
}

void relabel(int nod) {
    int mm = 2 * n + 10;
    for(int vecin : A[nod]) {
        if(c[nod][vecin] > f[nod][vecin]) {
            mm = min(mm, h[vecin]);
        }
    }
    h[nod] = mm + 1;
}

void discharge(int nod) {
    while(e[nod]) {
        for(auto it = A[nod].begin(); it != A[nod].end() && e[nod]; it++) {
            int vec = *it;
            if(c[nod][vec] > f[nod][vec] && h[nod] > h[vec]) {
                push(nod, vec);
            }
        }
        if(e[nod]) {
            relabel(nod);
        }
    }
}

int pushrelabel() {
    S = 1; 
    D = n;
    inq[S] = inq[D] = true;
    h[S] = n;
    e[S] = INF;
    for(auto it = A[S].begin(); it != A[S].end(); it++) {
        int vec = *it;
        if(c[S][vec] > f[S][vec]) {
            push(S, vec);
        }
    }

    while(!Q.empty()) {
        int nod = Q.front();
        Q.pop();
        inq[nod] = false;
        discharge(nod);
    }
    return e[D];
}

int main() {
    fin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int a, b, cap;
        fin >> a >> b >> cap;
        A[a].push_back(b);
        A[b].push_back(a);
        c[a][b] = cap;
    }

    fout << pushrelabel();
}