Cod sursa(job #309945)

Utilizator sandyxpSanduleac Dan sandyxp Data 1 mai 2009 14:53:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;

#define NUME "fmcm"
ifstream fi(NUME".in");
ofstream fo(NUME".out");
#define MAXN 351
#define INF 0x3f3f3f3f

int N, M, S, D;
struct list { int nod, cost; list *r; } *L[MAXN];
int F[MAXN][MAXN], C[MAXN][MAXN];
int Dist[MAXN], T[MAXN], U[MAXN], inque[MAXN];

#define avail(i, j) (C[i][j] - F[i][j])

int bellman(int S, int D)
{
    memset(Dist, INF, sizeof(T));
    memset(U, 0, sizeof(T));
    memset(inque, 0, sizeof(T));

    queue<int> Q;
    Q.push(S);
    Dist[S] = 0;
    while (!Q.empty()) {
        int x = Q.front();
        U[x] ++;
        Q.pop(); inque[x] = 0;
        if (U[x] == N) // ciclu
            return INF;
        for (list *p = L[x]; p; p = p->r) {
            if (avail(x, p->nod) > 0 && Dist[p->nod] > Dist[x] + p->cost) {
                Dist[p->nod] = Dist[x] + p->cost;
                T[p->nod] = x;
                if (inque[p->nod] == 0)
                    inque[p->nod] = 1, Q.push(p->nod);
            }
        }
    }
    return Dist[D];
}

void push(int x, int y, int c) {
    list *p = new list;
    *p = (list) { y, c, L[x] };
    L[x] = p;
}

void fluxul(int S, int D)
{
    int f, c, r, dist, i;
    for (f = c = 0; (dist = bellman(S, D)) != INF; f += r, c += r*dist) {
        r = INF;
        for (i = D; i != S; i = T[i])
            r = min(r, avail(T[i], i));
        for (i = D; i != S; i = T[i])
            F[ T[i] ][i] += r, F[i][ T[i] ] -= r;
    }
    fo << c << "\n";
}

void citirea()
{
    int i;
    fi >> N >> M >> S >> D;
    while (M--) {
        int x, y, c, cost;
        fi >> x >> y >> c >> cost;
        push(x, y, cost);
        push(y, x, -cost);
        C[x][y] = c;
    }
}

int main()
{
    citirea();
    fluxul(S, D);
    return 0;
}