Cod sursa(job #2391559)

Utilizator Constantin.Dragancea Constantin Constantin. Data 28 martie 2019 22:55:47
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

#define N 805
int n, c[N][N], f[N][N];
struct node{
    int h, eflow;
} ver[N];

int overflow(){
    for (int i=1; i<=n; i++)
        if (ver[i].eflow) return i;
    return 0;
}

void preFlow(int s){
    for (int i=1; i<=n; i++) ver[i] = {0, 0};
    ver[s].h = n;
    for (int i=1; i<=n; i++)
        if (s != i && c[s][i]) ver[i].eflow = f[s][i] = c[s][i];
}

bool push(int q){
    for (int i=1; i<=n; i++){
        if (q == i || !c[q][i]) continue;
        if (ver[q].h > ver[i].h){
            int flow = min(c[q][i], ver[i].eflow);
            ver[q].eflow -= flow;
            ver[i].eflow += flow;
            c[q][i] -= flow;
            c[i][q] += flow;
            return 1;
        }
    }
    return 0;
}

void relabel(int q){
    int mn = 1e9;
    for (int i=1; i<=n; i++){
        if (q == i || !c[q][i]) continue;
        mn = min(mn, ver[i].h);
    }
    ver[q].h = mn + 1;
}

int maxFlow(int s, int t){
    preFlow(s);
    for (int u = overflow(); u; u = overflow())
        if (!push(u)) relabel(u);
    return ver[t].eflow;
}


int main(){
    ifstream cin ("maxflow.in");
    //ofstream cout ("maxflow.out");
    cin >> n;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++) cin >> c[i][j];
    cout << maxFlow(1, n);
    return 0;
}