Cod sursa(job #2473589)

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

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

int bf(){
    int j,nod,vecin,gasit=0;
    unsigned int i;
    ok.reset();
    for (j=1;j<=n;j++)
        D[j]=INF;
    D[s]=0;
    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[vecin]>D[nod]+Z[nod][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(){
    FILE* fin=fopen("fmcm.in","r");
    FILE* fout=fopen("fmcm.out","w");
    fscanf(fin,"%d%d%d%d",&n,&m,&s,&d);
    for (int i=1;i<=m;i++){
        fscanf(fin,"%d%d%d%d",&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 (int j=d;j!=s;j=T[j])
            minim=min(minim,C[T[j]][j]-F[T[j]][j]);
        for (int j=d;j!=s;j=T[j]){
            F[T[j]][j]+=minim;
            F[j][T[j]]-=minim;
        }
        cost+=minim*D[d];
    }
    fprintf(fout,"%d",cost);
}