Cod sursa(job #3207034)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 24 februarie 2024 20:29:20
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
const int NMAX=405;
#define int long long

using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

vector <int> v[NMAX];
queue <int> c;
int cost[NMAX][NMAX], cap[NMAX][NMAX];
int dist[NMAX], minm[NMAX], t[NMAX], viz[NMAX];
int n, m, s, d;
bool newc=true;

int flux();
int bellman(int);

signed main()
{
    int i, a, b, c, dd;
    fin>>n>>m>>s>>d;
    for(i=1; i<=m; i++)
    {
        fin>>a>>b>>c>>dd;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b]=c;
        cost[a][b]=dd;
        cost[b][a]=-dd;
    }
    fout<<flux();
    return 0;
}

int flux()
{
    int ans=0;
    while(newc)
    {
        newc=false;
        ans+=bellman(s);
    }
    return ans;
}

int bellman(int nod)
{
    int i, p;
    for(i=1; i<=n; i++)
    {
        dist[i]=1e18;
        viz[i]=0;
        minm[i]=1e18;
        t[i]=s;
    }
    c.push(nod);
    dist[nod]=0;
    while(!c.empty())
    {
        p=c.front(); c.pop();
        if(viz[p]>n) continue;
        viz[p]++;
        for(auto i:v[p])
        {
            if(cap[p][i]>0 && dist[i]>dist[p]+cost[p][i])
            {
                dist[i]=dist[p]+cost[p][i];
                minm[i]=min(minm[p], cap[p][i]);
                t[i]=p;
                if(viz[i]<n) c.push(i);
            }
        }
    }
    if(dist[d]==1e18) return 0;
    nod=d; newc=true;
    while(nod!=s)
    {
        cap[t[nod]][nod]-=minm[d];
        cap[nod][t[nod]]+=minm[d];
        nod=t[nod];
    }
    return minm[d]*dist[d];
}