Cod sursa(job #2469468)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 7 octombrie 2019 14:19:05
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#define DIM 360
#define inf 2000000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,i,x,y,s,d,c,z,sol,fmin,nod,vecin,t[DIM],cap[DIM][DIM],dist[DIM],flux[DIM][DIM],cost[DIM][DIM];
bitset<DIM> v;
deque<int> q;
vector<int> L[DIM];
int bf() {
    int gasit=0;
    v.reset();
    q.clear();
    for (i=1;i<=n;i++)
        dist[i]=inf;
    q.push_back(s);
    v[s]=1, dist[s]=0;
    while (!q.empty()) {
        x=q.front();
        q.pop_front();
        v[x]=0;
        for (i=0;i<L[x].size();i++) {
            y=L[x][i];
            int c=cost[x][y];
            if (dist[y]>dist[x]+c&&cap[x][y]-flux[x][y]>0) {
                t[y]=x;
                dist[y]=dist[x]+c;
                if (v[y]==0) {
                    q.push_back(y);
                    v[y]=1;
                }
                if (y==d)
                    gasit=1;
            }
        }
    }
    return gasit;
}
int main() {
    fin>>n>>m>>s>>d;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>z>>c;
        L[x].push_back(y);
        L[y].push_back(x);
        cap[x][y]=z;
        cost[x][y]=c;
        cost[y][x]=-c;
    }
    while (bf()) {
        fmin=inf;
        nod=d;
        while (nod!=s) {
            fmin=min(fmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
            nod=t[nod];
        }
        nod=d;
        while (nod!=s) {
            flux[t[nod]][nod]+=fmin;
            flux[nod][t[nod]]-=fmin;
            sol+=fmin*cost[t[nod]][nod];
            nod=t[nod];
        }
    }
    fout<<sol;
    return 0;
}