Cod sursa(job #2473579)

Utilizator TheSeekerRobert Cristian Dobra TheSeeker Data 13 octombrie 2019 20:59:01
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define DIM 355
#define INF 2147483647
using namespace std;

ifstream fin ("fmcm.in");
ofstream fout("fmcm.out");

int n,m,s,d,i,j,x,y,c,z,nod,vecin,cost,minim,C[DIM][DIM],F[DIM][DIM],Z[DIM][DIM],D[DIM],T[DIM];
bool ok[DIM];
vector< int > L[DIM];
deque< int > q;

int bf(){
    int gasit=0;
    memset(ok,0,sizeof(ok));
    for (i=1;i<=n;i++)
        D[i]=INF;
    D[s]=0;
    q.clear();
    q.push_back(s);
    while (!q.empty()){
        nod=q.front();
        q.pop_front();
        ok[nod]=0;
        for (i=0;i<L[nod].size();i++){
            vecin=L[nod][i];
            if (C[nod][vecin]>F[nod][vecin] && D[nod]+Z[nod][vecin]<D[vecin]){
                D[vecin]=D[nod]+Z[nod][vecin];
                T[vecin]=nod;
                if (!ok[vecin]){
                    ok[vecin]=1;
                    q.push_back(vecin);
                    if (vecin==d)
                        gasit=1;
                }
            }
        }
    }
    return gasit;
}

int main(){
    fin>>n>>m>>s>>d;
    for (i=1;i<=m;i++){
        fin>>x>>y>>c>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=c;
        Z[x][y]=z;
        Z[y][x]=-z;
    }
    while (bf()){
        minim=INF;
        for (j=d;j!=s;j=T[j])
            minim=min(minim,C[T[j]][j]-F[T[j]][j]);
        for (j=d;j!=s;j=T[j]){
            F[T[j]][j]+=minim;
            F[j][T[j]]-=minim;
        }
        cost+=minim*D[d];
    }
    fout<<cost;
    fin.close();
    fout.close();
    return 0;
}