Cod sursa(job #2447939)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 15 august 2019 09:22:53
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.76 kb
#include<bits/stdc++.h>

using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
const int M = 25010;
const int N = 351;
int n,m,s,d,i,j,k,cp,cs,cap[N][N],flow[N][N],q[N],dad[N],P[N],price[N][N],PRICE,djikstra(),
LH,H[N],PH[N],oo=2000000000;
vector<int> v[N];
deque<int> Q;
void upd(),bellman(),HD(int),HU(int);
priority_queue<pair<int,int>> pq;
int main()
{
    f>>n>>m>>s>>d;
    for(; m; m--)
    {
        f>>i>>j>>cp>>cs;
        cap[i][j]=cp;
        price[i][j]=cs;
        price[j][i]=-cs;
        v[i].push_back(j);
        v[j].push_back(i);
    }
    bellman();
    while(djikstra())
        upd();
    g<<PRICE;
    return 0;
}
void bellman()
{
    for(i=1; i<=n; i++)P[i]=oo;
    P[s]=0;
    dad[s]=s;
    dad[d]=0;
    Q.resize(0);
    Q.push_back(s);
    q[s]=1;
    for(; Q.size();)
    {
        int nod=Q.front();
        for(auto vec:v[nod])
            if(cap[nod][vec]-flow[nod][vec]>0&&P[vec]>P[nod]+price[nod][vec])
            {
                if(!q[vec])
                {
                    q[vec]=1;
                    Q.push_back(vec);
                }
                dad[vec]=nod;
                P[vec]=P[nod]+price[nod][vec];
            }
        Q.pop_front();
        q[nod]=0;
    }
    cs=P[d];
}
int djikstra()
{
    for(i=1; i<=n; i++)
    {
        if(P[i]==oo)continue;
        for(auto vec:v[i])
        {
            if(P[vec]==oo)continue;
            price[i][vec]+=P[i]-P[vec];
        }
    }

    for(i=1; i<=n; i++)
    {
        P[i]=oo;
        dad[i]=i;
    }

    pq.push(make_pair(0,s));
    P[s]=0;
    while(pq.size())
    {
        int nod,cst;
        tie(cst,nod)=pq.top();
        pq.pop();
        cst=-cst;
        if(cst>P[nod])continue;
        for(auto vec:v[nod])
            if(flow[nod][vec]<cap[nod][vec])
                if(P[vec]>P[nod]+price[nod][vec])
                {
                    P[vec]=P[nod]+price[nod][vec];
                    pq.push(make_pair(-P[vec],vec));
                    //HU(PH[vec]);
                    dad[vec]=nod;
                }
    }
    return P[d]==oo?0:1;
}
void upd()
{

    cs+=P[d];
    for(m=oo,i=d,j=dad[d]; i-j; i=dad[i],j=dad[j])m=min(m,cap[j][i]-flow[j][i]);
    PRICE+=m*cs;
    for(i=d,j=dad[d]; i-j; i=dad[i],j=dad[j])
    {
        flow[i][j]-=m;
        flow[j][i]+=m;
    }
}
void HU(int F)
{
    int T=F>>1,A;
    if(!T)return;
    if(P[H[T]]<=P[H[F]])return;
    A=H[F];
    H[F]=H[T];
    H[T]=A;
    PH[H[T]]=T;
    PH[H[F]]=F;
    HU(T);
}
void HD(int T)
{
    int F=T<<1,A;
    if(F>LH)return;
    if(F<LH) if(P[H[F+1]]<P[H[F]])F++;
    if(P[H[F]]>=P[H[T]])return;
    A=H[F];
    H[F]=H[T];
    H[T]=A;
    PH[H[T]]=T;
    PH[H[F]]=F;
    HD(F);
}