Cod sursa(job #2592218)

Utilizator matei123Biciusca Matei matei123 Data 1 aprilie 2020 13:48:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
void read();
int n, m, S, D, minn, zmax;
vector<int> v[352];
bool viz[352];
int c[352][352], z[352][352], d[352], p[352], cost, b[352], r[352];
void bellman()
{   queue<int> q;
    for(int i=1; i<=n; i++) b[i] = INT_MAX;
    b[S] = 0;
    q.push(S);
    viz[S] = 1;
    while(!q.empty())
    {   int nod = q.front();
        q.pop();
        viz[nod] = 0;
        for(auto it:v[nod])
            if(b[nod] + z[nod][it] < b[it] && c[nod][it] > 0)
            {   b[it] = b[nod] + z[nod][it];
                if(!viz[it])
                {   q.push(it);
                    viz[it] = 1;
                }
            }
    }
}
int cst_transform(int x, int y)
{   return z[x][y] + b[x] - b[y]; }
bool dijkstra()
{   priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > q;
    for(int i=1; i<=n; i++) d[i] = INT_MAX;
    for(int i=1; i<=n; i++) viz[i] = 0;
    minn = INT_MAX;
    q.push(pair<int,int>(0, S));
    d[S] = 0; r[S] = 0;
    while(!q.empty())
    {   int nod = q.top().second, cst = q.top().first;
        q.pop();
        if(d[nod]!=cst) continue;
        if(viz[nod]) continue;
        viz[nod] = 1;
        for(auto it:v[nod])
            if(d[nod] + cst_transform(nod, it) < d[it] && c[nod][it] > 0)
            {   r[it] = z[nod][it] + r[nod];
                d[it] = d[nod] + cst_transform(nod, it);
                p[it] = nod;
                q.push(pair<int,int>(d[it], it));
            }
    }
    for(int i=1; i<=n; i++) b[i] = r[i];
    if(d[D] == INT_MAX) return 0;
    int nod = D;
    while(p[nod])
    {   minn = min(minn, c[p[nod]][nod]);
        nod = p[nod];
    }
    nod = D;
    while(p[nod])
    {   c[p[nod]][nod]-=minn;
        c[nod][p[nod]]+=minn;
        nod = p[nod];
    }
    cost+=minn*r[D];
    return 1;
}
int main()
{   read();
    bellman();
    while(dijkstra());
    fout << cost;
    return 0;
}
void read()
{   fin>>n>>m>>S>>D;
    while(m--)
    {   int x, y, C, Z;
        fin>>x>>y>>C>>Z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] = C;
        z[x][y] = Z;
        z[y][x] = -Z;
    }
}