Cod sursa(job #2467353)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 4 octombrie 2019 08:08:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <cstring>
#define DIM 1001
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,i,x,y,z,nod,fmin,flux,vecin,c[DIM],v[DIM],t[DIM],cap[DIM][DIM],f[DIM][DIM];
vector<int> L[DIM];
int bfs() {
    memset(v,0,sizeof(v));
    int p=1,u=1;
    c[1]=v[1]=1;
    while (p<=u) {
        int nod=c[p];
        for (int i=0;i<L[nod].size();i++) {
            int vecin=L[nod][i];
            if (v[vecin]==0&&cap[nod][vecin]>f[nod][vecin]) {
                v[vecin]=1;
                c[++u]=vecin;
                t[vecin]=nod;
            }
        }
        p++;
    }
    return v[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 (i=0;i<L[n].size();i++) {
            vecin=L[n][i];
            if (v[vecin]==1&&cap[vecin][n]>f[vecin][n]) {
                fmin=cap[vecin][n]-f[vecin][n];
                nod=vecin;
                while (nod!=1) {
                    fmin=min(fmin,cap[t[nod]][nod]-f[t[nod]][nod]);
                    nod=t[nod];
                }
                flux+=fmin;
                f[vecin][n]+=fmin;
                f[n][vecin]-=fmin;
                nod=vecin;
                while (nod!=1) {
                    f[t[nod]][nod]+=fmin;
                    f[nod][t[nod]]-=fmin;
                    nod=t[nod];
                }
            }
        }
    }
    fout<<flux;
    return 0;
}