Cod sursa(job #2697698)

Utilizator theo2003Theodor Negrescu theo2003 Data 19 ianuarie 2021 12:47:54
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct path{
    int cap;
    const short int to, rev;
};
vector<path> g[1110];
int bi[5110], bv[1110], bp[1110], bs, bvnr = 1, bx = 0;
path* bf[1110];
short int n, m;
int bfs(){
    bs = 1;
    bx = 0;
    bi[0] = 1;
    bvnr++;
    bv[1] = bvnr;
    while(bx < bs){
        for(unsigned int x = 0;x<g[bi[bx]].size();x++){
            auto &p = g[bi[bx]][x];
            if((p.cap > 0) && (p.to == (n))){
                int minf = p.cap;
                for(short int x = bi[bx];x != 1;x = bp[x]){
                    if((bf[x]->cap) < minf)
                        minf = bf[x]->cap;
                }
                p.cap -= minf;
                g[p.to][p.rev].cap += minf;
                for(short int x = bi[bx];x != 1;x = bp[x]){
                    (bf[x])->cap -= minf;
                    g[bf[x]->to][bf[x]->rev].cap += minf;
                }
                return minf;
            }
            if((p.cap > 0) && (bv[p.to] != bvnr)){
                bv[p.to] = bvnr;
                bi[bs++] = p.to;
                bp[p.to] = bi[bx];
                bf[p.to] = &p;
            }
        }
        bx++;
    }
    return 0;
}
int main(){
    in>>n>>m;
    long long outv = 0;
    for(short int x = 0;x<m;x++){
        short int a, b;
        int c;
        in>>a>>b>>c;
        g[a].push_back({c, b, g[b].size()});
        g[b].push_back({0, a, g[a].size()-1});
    }
    int tmp;
    do{
        tmp = bfs();
        outv += tmp;
    }while(tmp);
    out<<outv<<endl;
    return 0;
}