Cod sursa(job #1390038)

Utilizator Ionut228Ionut Calofir Ionut228 Data 16 martie 2015 20:12:28
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

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

const int INF = 0x3f3f3f3f;

int N, M, S, D;
int Dmin[355];
int C[355][355], F[355][355], TT[355];
vector<pair<int, int> > V[355];
queue<int> Q;
bool inQ[355];

bool bellman()
{
    memset(inQ, false, sizeof(inQ));
    memset(Dmin, INF, sizeof(Dmin));

    Dmin[S] = 0;
    Q.push(S);
    inQ[S] = true;

    while (!Q.empty())
    {
        int now = Q.front();
        Q.pop();
        inQ[now] = false;

        if (now == D)
            continue;

        for (vector<pair<int, int> >::iterator it = V[now].begin(); it != V[now].end(); ++it)
        {
            if (F[now][it->first] < C[now][it->first])
            {
                if (Dmin[now] + it->second < Dmin[it->first])
                {
                    Dmin[it->first] = Dmin[now] + it->second;
                    TT[it->first] = now;
                    if (!inQ[it->first])
                    {
                        Q.push(it->first);
                        inQ[it->first] = true;
                    }
                }
            }
        }
    }

    return (Dmin[D] != INF);
}

int main()
{
    fin >> N >> M >> S >> D;
    for (int i = 1, nod1, nod2, cap, cost; i <= M; ++i)
    {
        fin >> nod1 >> nod2 >> cap >> cost;
        V[nod1].push_back(make_pair(nod2, cost));
        V[nod2].push_back(make_pair(nod1, -cost));
        C[nod1][nod2] = cap;
    }

    int cost = 0, fmin = INF;
    while (bellman())
    {
        fmin = INF;
        for (int nod = D; nod != S; nod = TT[nod])
            fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
        if (fmin == 0)
            continue;

        for (int nod = D; nod != S; nod = TT[nod])
        {
            F[TT[nod]][nod] += fmin;
            F[nod][TT[nod]] -= fmin;
        }

        cost += fmin * Dmin[D];
    }

    fout << cost << '\n';

    fin.close();
    fout.close();
    return 0;
}