Cod sursa(job #1182270)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 5 mai 2014 18:21:50
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

ifstream in("fmcm.in");
ofstream out("fmcm.out");

const int N = 351;
const int INF = 2000000000;

int n, m, s, d;
vector<int> v[N];
int cost[N][N], flux[N][N], cap[N][N];
bool ver, ve[N];
int dist[N], p[N];

int bf() {
    queue<int> q;
    int i;

    for(i = 0; i < N; ++i) {
        dist[i] = INF;
        ve[i] = 0;
    }

    q.push(s);
    ve[s] = 1;
    dist[s] = 0;

    while(!q.empty()) {
        int el = q.front();
        q.pop();
        ve[el] = 0;

        for(vector<int>::iterator it = v[el].begin(); it != v[el].end(); ++it)
            if(cap[el][*it] - flux[el][*it] > 0 && dist[*it] > dist[el] + cost[el][*it]) {
                dist[*it] = dist[el] + cost[el][*it];

                if(!ve[*it]) {
                    ve[*it] = 1;
                    q.push(*it);
                }
                p[*it] = el;
            }
    }

    if(dist[d] != INF) {
        ver = 1;

        int smin = INF;

        for(i = d; i != s; i = p[i])
            smin = min(smin, cap[p[i]][i] - flux[p[i]][i]);

        for(i = d; i != s; i = p[i]) {
            flux[p[i]][i] += smin;
            flux[i][p[i]] -= smin;
        }

        return smin * dist[d];
    }
    return 0;
}

int cmin() {
    ver = 1;
    int rez = 0;

    while(ver) {
        ver = 0;

        rez += bf();
    }

    return rez;
}

int main() {
    int i;

    in >> n >> m >> s >> d;

    for(i = 1; i <= m; ++i) {
        int a, b, c, d;
        in >> a >> b >> c >> d;

        v[a].push_back(b);
        v[b].push_back(a);

        cap[a][b] = c;

        cost[a][b] = d;
        cost[b][a] = -d;
    }

    out << cmin();

    return 0;
}