Cod sursa(job #1739449)

Utilizator akaprosAna Kapros akapros Data 9 august 2016 14:57:30
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>
#define maxN 352
#define ll long long
#define inf 2000000000
using namespace std;
int n, m, s, d, D[maxN], prv[maxN], cost[maxN][maxN], c[maxN][maxN], f[maxN][maxN];
vector < int > V[maxN];
queue < int > q;
bool inq[maxN];
bool way;
ll ans;
void read()
{
    int i;
    freopen("fmcm.in", "r", stdin);
    scanf("%d %d %d %d", &n, &m, &s, &d);
    for (i = 1; i <= m; ++ i)
    {
        int x, y, z, C;
        scanf("%d %d %d %d", &x, &y, &C, &z);
        V[x].push_back(y);
        V[y].push_back(x);
        cost[x][y] = z;
        cost[y][x] = -z;
        c[x][y] = C;
    }
}
void BellmanFord()
{
    int i, j;
    for (i = 1; i <= n; ++ i)
    {
        D[i] = inf;
        prv[i] = -1;
    }
    memset(inq, 0, sizeof(inq));
    D[s] = 0;
    inq[s] = 1;
    q.push(s);
    while (!q.empty())
    {
        int nod, x = q.front();
        inq[x] = 0;
        q.pop();
        for (i = 0; i < V[x].size(); ++ i)
            if (c[x][nod = V[x][i]] - f[x][V[x][i]] > 0 && D[nod] > D[x] + cost[x][nod])
            {
                D[nod] = D[x] + cost[x][nod];
                prv[nod] = x;
                if (!inq[nod])
                {
                    inq[nod] = 1;
                    q.push(nod);
                }
            }
    }
    if (D[d] != inf)
    {
        way = 1;
        int cf = inf;
        for (i = d; i != s; i = prv[i])
            if (c[prv[i]][i] - f[prv[i]][i] < cf)
                cf = c[prv[i]][i] - f[prv[i]][i];
        for (i = d; i != s; i = prv[i])
        {
            f[prv[i]][i] += cf;
            f[i][prv[i]] -= cf;
        }
        ans += 1LL * cf * D[d];
    }
}
void solve()
{
    ans = 0;
    way = 1;
    while (way)
    {
        way = 0;
        BellmanFord();
    }
}
void write()
{
    freopen("fmcm.out", "w", stdout);
    printf("%lld\n", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}