Cod sursa(job #3197517)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 27 ianuarie 2024 05:09:16
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
vector<int>G[408];
int incoada[408],viz[408],cap[408][408],cost[408][408],tata[408],distaux[408],dist[408],s,d,cst,n,m,i,a,b,c,k,ok;
void bellman()
{
    int i;
    for(i=1; i<=n; i++)
        dist[i]=2e9;
    dist[s]=0;
    queue<int>Q;
    Q.push(s);
    incoada[s]=1;
    while(!Q.empty())
    {
        int x=Q.front();
        incoada[x]=0;
        Q.pop();
        for(auto j:G[x])
            if(cap[x][j]&&dist[j]>dist[x]+cost[x][j])
            {
                dist[j]=dist[x]+cost[x][j];
                if(!incoada[j])
                {
                    incoada[j]=1;
                    Q.push(j);
                }
            }
    }
}

long long int dijkstra()
{
    int i;
    for(i=1; i<=n; i++)
    {
        distaux[i]=dist[i];
        dist[i]=2e9;
    }
    dist[s]=0;
    priority_queue<pair<int,int>>Q;
    Q.push({0,s});
    while(!Q.empty())
    {
        int k=Q.top().second;
        Q.pop();
        if(viz[k]==0)
        {
            viz[k]=1;
            for(auto j:G[k])
                if(cap[k][j]>0 && dist[j]>dist[k]+cost[k][j]+distaux[k]-distaux[j])
                {
                    dist[j]=dist[k]+cost[k][j]+distaux[k]-distaux[j];
                    tata[j]=k;
                    Q.push({-dist[j],j});
                }
        }
    }
    for(i=1;i<=n;i++)
        viz[i]=0;
    if(dist[d]!=2e9)
    {
        int fluxmin=2e9;
        ok=1;
        for(i=1;i<=n;i++)
            dist[i]+=distaux[i];
        for(i=d;i!=s;i=tata[i])
            fluxmin=min(fluxmin,cap[tata[i]][i]);
        for(i=d;i!=s;i=tata[i])
        {
            cap[tata[i]][i]-=fluxmin;
            cap[i][tata[i]]+=fluxmin;
        }
        return fluxmin*dist[d];
    }
    return 0;
}
long long int Flux()
{
    bellman();
    long long int ras=0;
    ok=1;
    while(ok==1)
    {
        ok=0;
        ras+=dijkstra();
    }
    return ras;
}
int main()
{
    cin>>n>>m>>s>>d;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>c>>k;
        cap[a][b]=c;
        cost[a][b]=k;
        cost[b][a]=-k;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    cout<<Flux();
    return 0;
}