Cod sursa(job #1514715)

Utilizator mariusn01Marius Nicoli mariusn01 Data 31 octombrie 2015 15:00:45
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <deque>
#include <vector>
#define INF 100000010
#define DIM 352
using namespace std;

int C[DIM][DIM];
int F[DIM][DIM];
int Z[DIM][DIM];

int U[DIM];
int T[DIM];
int D[DIM];
vector<int> L[DIM];
deque<int> q;

int n, m, s, d, i, y, x, z, c, minim, u, cost, flux;

int bf() {

    int nod, vecin;

    for (int i=1;i<=n;i++) {
        D[i] = INF;
        U[i] = 0;
    }
    D[s] = 0;
    U[s] = 1;
    q.clear();
    q.push_back(s);
    while (!q.empty()) {
        nod = q.front();
        q.pop_front();
        U[nod] = 0;

        for (int i=0;i<L[nod].size();i++) {
            vecin = L[nod][i];
            if (C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Z[nod][vecin]) {
                D[vecin] = D[nod] + Z[nod][vecin];
                T[vecin] = nod;
                if (U[vecin] == 0) {
                    q.push_back(vecin);
                    U[vecin] = 1;
                }
            }
        }
    }
    if (D[d] != INF)
        return 1;
    else
        return 0;
}


int main () {
    ifstream fin ("fmcm.in");
    ofstream fout("fmcm.out");

    fin>>n>>m>>s>>d;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>c>>z;
        C[x][y] = c;
        Z[x][y] = z;

        Z[y][x] = -z; // pe munchia inversa se pune - costul muchiei date
        L[x].push_back(y);
        L[y].push_back(x);
    }

    while (bf()) {
        minim = INF;
        u = d;
        while (u!=s) {
            if (minim  > C[ T[u] ][u] - F[ T[u] ][u])
                minim  = C[ T[u] ][u] - F[ T[u] ][u];
            u = T[u];
        }
        u = d;
        while (u!=s) {
            cost += minim * Z[ T[u] ][u];
            F[ T[u] ][u] += minim;
            F[u][ T[u] ] -= minim;
            u = T[u];
        }
        flux += minim;
    }

    fout<<cost;

    return 0;
}