Cod sursa(job #2044138)

Utilizator rangal3Tudor Anastasiei rangal3 Data 20 octombrie 2017 22:23:28
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <queue>
#include <vector>
#define file "fmcm"
#define N 355
#define oo 1e7

using namespace std;

ifstream fin(file".in");
ofstream fout(file".out");

int n,m,s,d,x,y,c,z;
int cc[N][N],zz[N][N],f[N][N];// cc - capacitate, zz - cost, f - flux

int ant[N],dist[N];
queue<int> q;

vector<int> g[N]; //muchii
bool E[N];

void citire()
{
    fin>>n>>m>>s>>d;

    while(m--)
    {
        fin>>x>>y>>c>>z;
        g[x].push_back(y);
        g[y].push_back(x);
        cc[x][y] = c;
        //cc[y][x] = 0
        zz[x][y] = z;
        zz[y][x] = -z;
    }
}

inline int BellmanFord()
{
    int p,nod;

    for(int i=1; i<=n; ++i)
        dist[i] = oo;
    dist[s] = 0;
    //dist[i] distanta de la sursa s la i
    E[s] = 1;
    // E[i] = 1, daca nodul i este in coada nu trebuie adaugat din nou, modificarile vor fi aceleasi

    q.push(s);

    while(!q.empty())
    {
        nod = q.front();
        q.pop();

        for(int i=0; i<g[nod].size(); ++i)
        {
            p = g[nod][i]; //nodul urmator
            if(dist[p] > dist[nod] + zz[nod][p] && cc[nod][p] - f[nod][p] > 0)
            {
                dist[p] = dist[nod] + zz[nod][p];
                ant[p] = nod;
                if(!E[p])
                {
                    q.push(p);
                    E[p] = 1;
                }
            }
        }

        E[nod] = 0;

    }

    if(dist[d] == oo) return 0;

    int fluxmin = oo;
    for(int nod = d; nod != s; nod = ant[nod])
        fluxmin = min(fluxmin,cc[ant[nod]][nod] - f[ant[nod]][nod]);

    for(int nod = d; nod != s; nod = ant[nod])
    {
        f[ant[nod]][nod] += fluxmin;
        f[nod][ant[nod]] -= fluxmin;
    }

    return fluxmin * dist[d];
}

int main()
{
    citire();

    int flux = 0,sol = 0;

    do
    {
        flux += sol;
        sol = BellmanFord();
    }while(sol != 0);

    fout<<flux<<"\n";

    return 0;
}