Cod sursa(job #1241473)

Utilizator geniucosOncescu Costin geniucos Data 13 octombrie 2014 17:07:36
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

int N, M, S, D, flow, fmin, bell[355], cum[355], f[355][355], C[355][355], bani[355][355];
vector < int > v[355];
queue < int > cc;

void bellman()
{
    for (int i=1; i<=N; i++)
        bell[i] = 1<<28;
    bell[S] = 0;
    cc.push(S);
    while (!cc.empty())
    {
        int nod = cc.front();
        cc.pop();
        for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
            if (f[nod][*it] < C[nod][*it] && bell[*it] > bell[nod] + bani[nod][*it])
            {
                bell[*it] = bell[nod] + bani[nod][*it];
                cum[*it] = nod;
                cc.push(*it);
            }
    }
}

int main()
{
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);

scanf ("%d %d %d %d", &N, &M, &S, &D);
for (int i=1; i<=M; i++)
{
    int X, Y, Z, c;
    scanf ("%d %d %d %d", &X, &Y, &c, &Z);
    v[X].push_back(Y);
    v[Y].push_back(X);
    C[X][Y] = c;
    bani[X][Y] = Z;
    bani[Y][X] = -Z;
}

while (1)
{
    bellman();
    if (bell[D] >= (1<<28)) break;
    fmin = (1<<28);
    for (int i = D; i != S; i = cum[i])
        if (C[cum[i]][i] - f[cum[i]][i] < fmin)
            fmin = C[cum[i]][i] - f[cum[i]][i];
    flow += fmin * bell[D];
    for (int i = D; i != S; i = cum[i])
    {
        f[cum[i]][i] += fmin;
        f[i][cum[i]] -= fmin;
    }
}
printf ("%d\n", flow);

return 0;
}