Cod sursa(job #2564941)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 2 martie 2020 11:12:27
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define DIM 1010
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,i,x,y,z,nod,vecin,fluxmin,fluxtotal,t[DIM],cap[DIM][DIM],flux[DIM][DIM];
queue<int> q;
bitset<DIM> f;
vector<int> L[DIM];
int bfs() {
    f.reset();
    q.push(1), f[1]=1;
    while (!q.empty()) {
        int nod=q.front();
        q.pop();
        for (auto vecin:L[nod]) {
            if (f[vecin]==0&&cap[nod][vecin]>flux[nod][vecin]) {
                f[vecin]=1;
                q.push(vecin);
                t[vecin]=nod;
            }
        }
    }
    return f[n];
}
int main() {
    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        cap[x][y]=z;
    }
    while (bfs()) {
        for (auto vecin:L[n]) {
            if (f[vecin]==1&&cap[vecin][n]>flux[vecin][n]) {
                fluxmin=cap[vecin][n]-flux[vecin][n];
                nod=vecin;
                while (nod!=1) {
                    fluxmin=min(fluxmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
                    nod=t[nod];
                }
                fluxtotal+=fluxmin;
                flux[vecin][n]+=fluxmin;
                flux[n][vecin]-=fluxmin;
                nod=vecin;
                while (nod!=1) {
                    flux[t[nod]][nod]+=fluxmin;
                    flux[nod][t[nod]]-=fluxmin;
                    nod=t[nod];
                }
            }
        }
    }
    fout<<fluxtotal;
    return 0;
}