Cod sursa(job #2398300)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 5 aprilie 2019 11:57:52
Problema Flux maxim de cost minim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
int pr[352],c[352][352],a[352][352],d[2][352],cst[352],n,S,D;
vector<int> v[352];
queue<int> q;
priority_queue<pair<int,int>> h;
bool dij(int k)
{
    int nr1,nr2;
    memset(pr,0,sizeof(pr));
    memset(cst,0,sizeof(cst));
    h.push({-1,S});
    cst[S]=1;
    d[1-k][S]=0;
    while(!h.empty())
    {
        nr1=h.top().first;nr2=h.top().second;
        cst[nr2]=-nr1;
        for(auto it:v[nr2])
            if(c[nr2][it]&&(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]<-cst[it]||!cst[it]))
            {
                cst[it]=-(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]);
                d[1-k][it]=d[1-k][nr2]+a[nr2][it];
                pr[it]=nr2;
                h.push({cst[it],it});
            }
        while(!h.empty()&&h.top().first!=cst[h.top().second])
            h.pop();
    }
    return cst[D];
}
int val(int nr)
{
    if(nr==S)
        return 1<<29;
    return min(c[pr[nr]][nr],val(pr[nr]));
}
void rec(int nr,int s)
{
    if(nr==S)
        return;
    c[pr[nr]][nr]-=s;
    c[nr][pr[nr]]+=s;
    rec(pr[nr],s);
}
int main()
{
    int m,nr1,nr2,nr;
    in>>n>>m>>S>>D;
    while(m--)
    {
        in>>nr1>>nr2;
        v[nr1].push_back(nr2);
        v[nr2].push_back(nr1);
        in>>c[nr1][nr2]>>a[nr1][nr2];
        a[nr2][nr1]=-a[nr1][nr2];
    }
    q.push(S);
    while(!q.empty())
    {
        nr=q.front();
        q.pop();
        for(auto it:v[nr])
        {
            if(c[nr][it]&&d[1][nr]+a[nr][it]<d[1][it])
            {
                d[1][it]=d[1][nr]+a[nr][it];
                if(!pr[it])
                    pr[it]=1,q.push(it);
            }
        }
        pr[nr]=0;
    }
    nr=nr2=m=0;
    while(dij(nr2=1-nr2))
    {
        nr1=val(D);
        m+=nr1*d[1-nr2][D];
        nr+=nr1;
        rec(D,nr1);
    }
    out<<m;
    return 0;
}