Cod sursa(job #3223760)

Utilizator lucriLuchian Cristian lucri Data 13 aprilie 2024 15:32:37
Problema Flux maxim de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#include <bits/stdc++.h>
std::ifstream cin("fmcm.in");
std::ofstream cout("fmcm.out");
long long n,m,s,d,ans,x,y,z,t;
long long c[360][360],f[360][360],cost[360][360],val[360],newval[360],ant[360];
std::vector<std::vector<std::pair<long long,long long>>>a;
void belman(long long nod)
{
    std::queue<std::pair<long long,long long>>q;
    val[nod]=0;
    q.push({nod,0});
    while(!q.empty())
    {
        nod=q.front().first;
        long long cost=q.front().second;
        q.pop();
        if(cost>val[nod])
            continue;
        for(auto x:a[nod])
            if(c[nod][x.first]&&cost+x.second<val[x.first])
            {
                val[x.first]=cost+x.second;
                q.push({x.first,cost+x.second});
            }
    }
}
bool viz[360];
bool drum()
{
    for(long long i=1;i<=n;++i)
    {
        newval[i]=1000000000;
        viz[i]=ant[i]=0;
    }
    newval[s]=0;
    std::priority_queue<std::pair<long long,long long>>q;
    q.push({0,s});
    while(!q.empty())
    {
        long long nod=q.top().second,cost=-q.top().first;
        q.pop();
        if(viz[nod]==true)
            continue;
        viz[nod]=true;
        if(nod==d)
            return true;
        for(auto x:a[nod])
            if(c[nod][x.first]!=f[nod][x.first]&&cost+x.second+val[nod]-val[x.first]<newval[x.first])
            {
                newval[x.first]=cost+x.second+val[nod]-val[x.first];
                ant[x.first]=nod;
                q.push({-newval[x.first],x.first});
            }
    }
    return false;
}
void flux()
{
    while(drum())
    {
        long long fl=1000000000,dr=0;
        for(long long cop=d;cop!=s;cop=ant[cop])
        {
            dr+=cost[ant[cop]][cop];
            fl=std::min(fl,c[ant[cop]][cop]-f[ant[cop]][cop]);
        }
        for(long long cop=d;cop!=s;cop=ant[cop])
        {
            val[cop]=dr;
            dr-=cost[ant[cop]][cop];
            f[ant[cop]][cop]+=fl;
            ans+=fl*cost[ant[cop]][cop];
        }
    }
}
int main()
{
    cin>>n>>m>>s>>d;
    a.resize(n+5);
    for(long long i=1;i<=n;++i)
        val[i]=1000000000;
    for(long long i=1;i<=m;++i)
    {
        cin>>x>>y>>z>>t;
        a[x].push_back({y,t});
        a[y].push_back({x,-t});
        c[x][y]=z;
        cost[x][y]=t;
        cost[y][x]=-t;
    }
    belman(s);
    flux();
    cout<<ans;
    return 0;
}