Cod sursa(job #2398306)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 5 aprilie 2019 12:01:46
Problema Flux maxim de cost minim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 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 main()
{
    int m,nr1,nr2,nr,i;
    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))
    {
        for(nr1=1<<29,i=D;i!=S;i=pr[i])
            nr1=min(nr1,c[pr[i]][i]);
        m+=nr1*d[1-nr2][D];
        nr+=nr1;
        for(i=D;i!=S;i=pr[i])
            c[pr[i]][i]-=nr1,c[i][pr[i]]+=nr1;
    }
    out<<m;
    return 0;
}