Cod sursa(job #1964011)

Utilizator Train1Train1 Train1 Data 12 aprilie 2017 23:32:34
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMax 1001
#define oo 999999999
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, x, y, z, e[NMax][NMax], tata[NMax], minValue[NMax];
bool viz[NMax];
vector <int> v[NMax];
queue <int> q;
queue <pair<int, int> >fr;
bool bfs(int R) {
    viz[R] = true;
    q.push(R);
    int nod, ok = 0;
    for(int i = 0; i <= n; i++) {
        minValue[i] = oo;
        viz[i] = false;
    }
    while(!q.empty()) {
        nod = q.front();
        q.pop();
        int nS = v[nod].size();
        for(int i = 0; i < nS; ++i) {
            int fiu = v[nod][i];
            if(viz[fiu] || e[nod][fiu] == 0)
                continue;
            if(fiu == n) {
                fr.push(make_pair(nod, min(minValue[nod], e[nod][fiu])));
                ok++;
                continue;
            }
            minValue[fiu] = min(minValue[nod], e[nod][fiu]);
            tata[fiu] = nod;
            viz[fiu] = true;
            q.push(fiu);
        }
    }
    return ok != 0;
}
int main()
{
    fin>>n>>m;
    for(int i = 1; i <= m; ++i) {
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        e[x][y] = z;
    }
    int R = 1, maxFlow = 0;
    while(bfs(1)) {
        while(!fr.empty()) {
            pair <int, int> Frunza = fr.front();
            int nod = Frunza.first;
            int value = Frunza.second;
            value = min(value, e[nod][n]);
            e[n][nod] += value;
            e[nod][n] -= value;
            while(nod != 1) {
                value = min(value, e[tata[nod]][nod]);
                e[nod][tata[nod]] += value;
                e[tata[nod]][nod] -= value;
                nod = tata[nod];
            }
            maxFlow += value;
            fr.pop();
        }
    }
    fout<<maxFlow;
    fin.close();
    fout.close();
    return 0;
}