Cod sursa(job #2986412)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 28 februarie 2023 16:30:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.89 kb
#include <bits/stdc++.h>
#include <fstream>
#define cin fin
#define cout fout
using namespace std;
ifstream cin ("fmcm.in");
ofstream cout ("fmcm.out");
vector<pair<int,int>>muchii;
int F[1008][1008],cap[1008][1008],distot[1008],dist1[1008],dist2[1008],S,D,tata[1008],n,nod,incoada[1008],cost[1008][1008],ok,ras,m,a,b,flux,pret;
vector<int>G[1008];
struct compar
{
    bool operator()(int a,int b)
    {
        return dist2[a]>dist2[b];
    }
};
priority_queue<int,vector<int>,compar>Q;
void bellmanford()
{
    for(int i=1;i<=n;i++)
    {
        dist1[i]=1e9;
    }
    queue<int>Q;
    dist1[S]=0;
    Q.push(S);
    while(!Q.empty())
    {
        nod=Q.front();
        Q.pop();
        for(auto i:G[nod])
        {
            if(cap[nod][i]>0 && dist1[i]>dist1[nod]+cost[nod][i])
            {
                dist1[i]=dist1[nod]+cost[nod][i];
                if(incoada[i]==0)
                {
                    incoada[i]=1;
                    Q.push(i);
                }
            }
        }
        incoada[nod]=0;
    }
}
int dij()
{
    for(int i=1;i<=n;i++)
    {
        dist2[i]=1e9;
        tata[i]=-1;
        distot[i]=1e9;
    }
    dist2[S]=0;
    distot[S]=0;
    Q.push(S);
    while(!Q.empty())
    {
        nod=Q.top();
        Q.pop();
        incoada[nod]=0;
        for(auto i:G[nod])
        {
            if(tata[nod]!=i && cap[nod][i]-F[nod][i]>0 && dist2[i]>dist2[nod]+cost[nod][i])
            {
                dist2[i]=dist2[nod]+cost[nod][i];
                distot[i]=distot[nod]+cost[nod][i]-dist1[nod]+dist1[i];
                tata[i]=nod;
                if(incoada[i]==0)
                {
                    incoada[i]=1;
                    Q.push(i);
                }
            }
        }
    }
    if(dist2[D]==1e9)
    {
        return 0;
    }
    else
    {
        ok=1;
        int flux=1e9;
        for(int i=D;i!=S;i=tata[i])
        {
            flux=min(flux,cap[tata[i]][i]-F[tata[i]][i]);
        }
        for(int i=D;i!=S;i=tata[i])
        {
            F[tata[i]][i]+=flux;
            F[i][tata[i]]-=flux;
        }
        return flux*distot[D];
    }
}
int Flux()
{
    bellmanford();
    for(auto i:muchii)
    {
        cost[i.first][i.second]+=dist1[i.first]-dist1[i.second];
        cost[i.second][i.first]+=dist1[i.second]-dist1[i.first];
    }
    ok=1;
    while(ok==1)
    {
        ok=0;
        ras+=dij();
    }
    return ras;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n>>m>>S>>D;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>flux>>pret;
        muchii.push_back({a,b});
        cap[a][b]=flux;
        G[a].push_back(b);
        if(cap[b][a]==0)
        {
            G[b].push_back(a);
        }
        cost[a][b]=pret;
        cost[b][a]=-pret;
    }
    cout<<Flux();
    return 0;
}