Cod sursa(job #2081433)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 4 decembrie 2017 18:32:23
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ( "maxflow.in");
ofstream out("maxflow.out");
vector<int>v[1001];
int cap[1001][1001],flux[1001][1001],tata[1001],vecin,graf[1001],vec[1001],minim,x,n,m,a,b,c,flux_total;
bool bfs (int f) {
    bool ok = 0;
    for (int i = 1; i <= n; i ++) {
        graf[i] = 0;
    }
    graf[1] = 1;
    tata[1] = 0;
    vec [1] = 1;
    for (int st = 1, dr = 1; st <= dr; st ++) {
        a = vec[st];
        for (int i = 0; i < v[a].size(); i ++) {
            b = v[a][i];
            if (cap[a][b] - flux[a][b] > 0 && graf[b] == 0) {
                if (b != n) {
                    graf[b] = graf[a] + 1;
                    tata[b] = a;
                    vec[++dr] = b;
                }
                else{
                    ok = 1;
                    tata[b] = a;
                    break;
                }
            }
        }
    }
    if (ok) {
        return 1;
    }
    else{
        return 0;
    }
}
int main (void) {
    in >> n >> m;
    for (int i = 1; i <= m; i ++) {
        in >> a >> b >> c;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b] = c;
    }
    for (int i = 0; i < v[n].size(); i ++) {
        vecin = v[n][i];
        while (bfs(vecin)) {
            minim = cap[vecin][n] - flux[vecin][n];
            x = n;
            while (tata[x] != 0) {
                minim = min (minim,cap[tata[x]][x]-flux[tata[x]][x]);
                x = tata[x];
            }
            x = n;
            while (tata[x] != 0) {
                flux[tata[x]][x] += minim;
                flux[x][tata[x]] -= minim;
                x = tata[x];
            }
            flux_total += minim;
        }
    }
    out << flux_total;
    return 0;
}