Cod sursa(job #1795238)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 2 noiembrie 2016 09:28:38
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;



const int NMAX = 360;
const int MMAX = 13000;
const int MULT = 15000;

int N, M, S, D;

vector<int> G[NMAX];

int capac[NMAX][NMAX];
int cost[NMAX][NMAX];
int flux[NMAX][NMAX];

int dist[NMAX];
int recon[NMAX];
int flag;
int

long long BellmanFordCheck () {
    for (int i = 1; i <= N; i++) {
        dist[i] = MULT;
        recon[i] = -1;
    }

   dist[S] = 0;
   int sf = 0;

    while (!sf) {
        sf = 1;

        for (int i = 1; i <= N; i++) {
            for (auto &it : G[i]) {
                if (capac[i][it] - flux[i][it] > 0 && dist[i] + cost[i][it] < dist[it]) {
                    dist[it] = dist[i] + cost[i][it];
                    recon[it] = i;
                    sf = 0;
                }
            }
        }
    }

    int add;
    add = MULT;
    flag = 1;

    for (int i = D; i != S; i = recon[i]) {
        add = min (add, capac[recon[i]][i] - flux[recon[i]][i]);
    }
    for (int i = D; i != S; i = recon[i]) {
        flux[recon[i]][i] += add;
        flux[i][recon[i]] -= add;
    }
    return add * dist[D];
}

long long fflux () {
    long long ANS = 0;
    flag = 1;
    while (flag) {
        flag = 0;
        ANS += BellmanFordCheck();
    }

    return ANS;
}

int main ()
{
    ifstream fin ("fmcm.in");
    ofstream fout ("fmcm.out");
    fin >> N >> M >> S >> D;

    for (int i = 1; i <= M; i++) {
        int x, y, c, z;
        fin >> x >> y >> c >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        capac[x][y] = c;
        cost[x][y] = z;
        cost[y][x] = -z;
    }

    fout << fflux();

    return 0;
}