Cod sursa(job #2842957)

Utilizator stefantagaTaga Stefan stefantaga Data 1 februarie 2022 19:23:54
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n,tata[355],dist[355],viz[355];
int flux[355][355],c[355][355];
vector <pair <int,int>> gr[355];
bool ok(int start, int dest)
{
    int i;
    for (i=1;i<=n;i++)
    {
        tata[i]=-1;
        dist[i]=1e9;
        viz[i]=0;
    }
    queue <int> q;
    tata[start]=0;
    dist[start]=0;
    q.push(start);
    while (!q.empty())
    {
        int acum = q.front();
        q.pop();
        viz[acum]=0;
        for (int i=0;i<gr[acum].size();i++)
        {
            int nod = gr[acum][i].first;
            if (flux[acum][nod]<c[acum][nod]&&dist[nod]>dist[acum]+gr[acum][i].second)
            {
                tata[nod]=acum;
                dist[nod]=dist[acum]+gr[acum][i].second;
                if (viz[nod]==0)
                {
                    viz[nod]=1;
                    q.push(nod);
                }
            }
        }
    }
    if (dist[dest]!=1e9)
    {
        return 1;
    }
    return 0;
}
int m,st,dest,i,x,y,cap,cost,suma,ceau;
int main()
{
    f>>n>>m>>st>>dest;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>cap>>cost;
        gr[x].push_back({y,cost});
        gr[y].push_back({x,-cost});
        c[x][y]=cap;
    }
    while (ok(st,dest))
    {
        int nod = dest;
        ceau = c[tata[nod]][nod]-flux[tata[nod]][nod];
        while (tata[nod]!=0)
        {
            ceau=min(ceau,c[tata[nod]][nod]-flux[tata[nod]][nod]);
            nod=tata[nod];
        }
        suma=suma+ceau*dist[dest];
        nod = dest;
        while (tata[nod]!=0)
        {
            flux[tata[nod]][nod]+=ceau;
            flux[nod][tata[nod]]-=ceau;
            nod=tata[nod];
        }
    }
    g<<suma;
    return 0;
}