Cod sursa(job #2985759)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 27 februarie 2023 00:42:57
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin ("fmcm.in");
ofstream cout ("fmcm.out");
vector<int>G[1008];
int a,b,c,f,n,m,S,D,i;
int ok,cap[1008][1008],cost[1008][1008],F[1008][1008],dist[1008],tata[1008],incoada[1008];
int bellmanford()
{
    for(i=1; i<=n; i++)
    {
        tata[i]=-1;
        dist[i]=1e9;
    }
    dist[S]=0;
    queue<int>Q;
    Q.push(S);
    incoada[S]=1;
    while(!Q.empty())
    {
        int nod=Q.front();
        Q.pop();
        for(auto i:G[nod])
            if(cap[nod][i]-F[nod][i]>0 && dist[nod]+cost[nod][i]<dist[i])
            {
                dist[i]=dist[nod]+cost[nod][i];
                tata[i]=nod;
                if(incoada[i]==0)
                {
                    Q.push(i);
                    incoada[i]=1;
                }
            }
        incoada[nod]=0;
    }
    if(dist[D]!=1e9)
    {
        int fluxul=1e9;
        i=D;
        while(i!=S)
        {
            fluxul=min(fluxul,cap[tata[i]][i]-F[tata[i]][i]);
            i=tata[i];
        }
        i=D;
        while(i!=S)
        {
            F[tata[i]][i]+=fluxul;
            F[i][tata[i]]-=fluxul;
            i=tata[i];
        }
        ok=1;
        return fluxul*dist[D];
    }
    return 0;
}
int Flux()
{
    int ras=0;
    ok=1;
    while(ok==1)
    {
        ok=0;
        ras+=bellmanford();
    }
    return ras;
}
int main()
{
    cin>>n>>m>>S>>D;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>f>>c;
        G[a].push_back(b);
        cap[a][b]=f;
        if(cap[b][a]==0)
            G[b].push_back(a);
        cost[a][b]=c;
        cost[b][a]=-c;
    }
    cout<<Flux();
    return 0;
}