Cod sursa(job #2446621)

Utilizator LucaSeriSeritan Luca LucaSeri Data 9 august 2019 21:24:10
Problema Flux maxim de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#include <bits/stdc++.h>
using namespace std;
 
#define mp make_pair
#define sz(x) (int)((x).size())
#define all(x) (x).begin(),(x).end()
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define eb emplace_back
 
typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef vector< pll > vpll;
typedef long double ld;
typedef vector< ld > vld;
 
const ll MOD = 1e9 + 7;

void fix(ll &x, ll MOD) {
    x = (x % MOD + MOD) % MOD;
    return;
}
 
ll lgput(ll a, ll b, ll MOD) {
    ll ret = 1;
    a %= MOD;
    while(b) {
        if(b&1) ret = ret*a % MOD;
        a = a*a % MOD;
        b >>= 1;
    }
    
    return ret;
}


struct f {
    int a, b;
    f(int _a = 0, int _b = 0) : a(_a) ,b(_b) {}
    ll eval(int x) {
        return 1ll*x*a + b;
    }
};

const int MAXN = 355;
const int inf = 0x3f3f3f3f;
int d[MAXN];
int p[MAXN];
int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
bool inQ[MAXN];

vector< int > gr[MAXN];

bool bfs(int s, int t) {
    memset(d, 0x3f, sizeof d);
    d[s] = 0;
    deque< int > q;
    q.push_front(s);
    inQ[s] = true;
    while(q.size()) {
        int node = q.front();
        inQ[node] = false;
        q.pop_front();

        for(auto &x : gr[node]) {
            if(cap[node][x]) {
                if(d[node] + cost[node][x] < d[x]) {
                    if(d[x] == inf) {
                        d[x] = d[node] + cost[node][x];
                        q.push_back(x);
                        inQ[x] = true;
                    } else if(!inQ[x]) {
                        d[x] = d[node] + cost[node][x];
                        q.push_front(x);
                        inQ[x] = true;
                    }

                    p[x] = node;
                }
            }
        }
    }

    return d[t] != inf;
}

int main() {   
    #ifdef BLAT
        freopen("stdin", "r", stdin);
        freopen("stderr", "w", stderr);
    #endif
    
    #ifdef INFOARENA
        freopen("fmcm.in", "r", stdin);
        freopen("fmcm.out", "w", stdout);
    #endif


    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(12);
    srand(time(NULL));

    int n, m, s, t;
    cin >> n >> m >> s >> t;

    for(int i = 1; i <= m; ++i) {
        int x, y, c, z;
        cin >> x >> y >> c >> z;

        gr[x].emplace_back(y);
        gr[y].emplace_back(x);
        cap[x][y] = c;
        cost[x][y] = z;
        cost[y][x] = -z;
    }

    int ans = 0;
    while(bfs(s, t)) {
        int node = t;
        int minim = inf;

        while(node != s) {
            minim = min(minim, cap[p[node]][node]);
            node = p[node];
        }

        node = t;
        while(node != s) {
            cap[p[node]][node] -= minim;
            cap[node][p[node]] += minim;
            node = p[node];
        }

        ans += minim * d[t];
    }

    cout << ans << '\n';
}