Cod sursa(job #2697658)

Utilizator theo2003Theodor Negrescu theo2003 Data 19 ianuarie 2021 11:30:29
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
vector<pair<long long, long long> > g[1010];
long long bi[1010], bv[1010], bp[1010], bs, bvnr = 1, bx = 0;
long long* bf[1010];
long long n, m;
long long bfs(){
    bs = 1;
    bx = 0;
    bi[0] = 0;
    bvnr++;
    bv[0] = bvnr;
    while(bx < bs){
        for(long long x = 0;x<g[bx].size();x++){
            auto &p = g[bx][x];
            if((p.second) && (p.first == (n-1))){
                long long minf = 1ll<<60;
                for(long long x = bi[bx];x != 0;x = bp[x]){
                    if((*bf[x]) < minf)
                        minf = *bf[x];
                }
                for(long long x = bi[bx];x != 0;x = bp[x]){
                    (*bf[x]) -= minf;
                }
                return minf;
            }
            if((p.second) && (bv[p.first] != bvnr)){
                bv[p.first] = bvnr;
                bi[bs++] = p.first;
                bp[p.first] = bi[bx];
                bf[p.first] = &p.second;
            }
        }
        bx++;
    }
    return 0;
}
int main(){
    in>>n>>m;
    long long outv = 0;
    for(long long x = 0;x<m;x++){
        long long a, b, c;;
        in>>a>>b>>c;
        g[a-1].push_back({b-1, c});
    }
    long long tmp;
    do{
        tmp = bfs();
        outv += tmp;
    }while(tmp);
    out<<outv<<endl;
    return 0;
}