Cod sursa(job #3040655)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 30 martie 2023 11:03:27
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("fmcm.in");
ofstream cout ("fmcm.out");
int c[400][400],t[400],f[400][400],p[400][400],d[400];
bool viz[400];
vector<int> g[400];
int oo = 1<<28;
int n,m,s,D;
int q[10000];
int st,dr;
int bfs (int incep)
{
    st = dr = 1;
    q[st] = incep;
    int i;
    for(i=1;i<=n;i++)
    {
        d[i] = oo;
        viz[i] = false;
    }
    d[incep] = 0;
    viz[incep] = true;
    while (st<=dr)
    {
        int nod = q[st];
        st++;
        viz[nod] = false;
        for (auto vf:g[nod])
        {
            if (c[nod][vf]!=f[nod][vf] && d[vf] > d[nod] + p[nod][vf])
            {
                d[vf] = d[nod] + p[nod][vf];
                t[vf] = nod;
                if (viz[vf]==false)
                {
                    viz[vf] = true;
                    q[++dr] = vf;
                }
            }
        }
    }
    return d[D];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> s >> D;
    int i,j,k;
    for(i=1;i<=m;i++)
    {
        int x,y,cap,pr;
        cin >> x >> y >> cap >> pr;
        g[x].push_back(y);
        g[y].push_back(x);

        c[x][y] = cap;
        p[x][y] = pr;
        p[y][x] = -pr;
    }
    int rasp = 0;
    while (true)
    {
        int nou = bfs(s);
        if (nou == oo)
            break;
        int minim = oo;
        for (i=D;i!=s;i=t[i])
            minim = min(minim,c[t[i]][i] - f[t[i]][i]);
        for (i=D;i!=s;i=t[i])
        {
            f[t[i]][i] = f[t[i]][i] + minim;
            f[i][t[i]] = f[i][t[i]] - minim;
        }
        rasp = rasp + nou*minim;
    }
    cout << rasp;
    return 0;
}