Cod sursa(job #1332848)

Utilizator ThomasFMI Suditu Thomas Thomas Data 2 februarie 2015 15:08:58
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;

#define NMax 355
#define inf 2100000000

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

int n,m;
int S,D;
int C[NMax][NMax],F[NMax][NMax],Cst[NMax][NMax];
int ant[NMax],d[NMax];
bool viz[NMax];
int cost;

bitset<NMax> B;
vector<int> v[NMax];
queue<int> cd;

int BellmanFord(int s)
{
    for(int i=1;i<=n;++i) d[i] = inf;
    d[S] = 0;

    cd.push(s);
    while(!cd.empty())
    {
        s = cd.front(); cd.pop();
        B[s] = 0;
        for(int i=0;i<v[s].size();++i) if(F[s][v[s][i]]<C[s][v[s][i]]) if(d[v[s][i]] > d[s] + Cst[s][v[s][i]])
        {
            d[v[s][i]] = d[s] + Cst[s][v[s][i]];
            ant[v[s][i]] = s;
            if(!B[v[s][i]])
            {
                cd.push(v[s][i]);
                B[v[s][i]] = 1;
            }
        }
    }

    if(d[D] == inf) return false;
    return true;
}

int main()
{
    int x,y,c,z;

    f>>n>>m>>S>>D;
    while(m--)
    {
        f>>x>>y>>c>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y] += c;
        Cst[x][y] = z;
        Cst[y][x] = -z;
    }

    int s,fmin;
    while(BellmanFord(S))
    {
        fmin = inf;
        s = D;
        while(ant[s])
        {
            fmin = min(fmin,C[ant[s]][s]-F[ant[s]][s]);
            s = ant[s];
        }

        s = D;
        while(ant[s])
        {
            F[ant[s]][s] += fmin;
            F[s][ant[s]] -= fmin;
            s = ant[s];
        }

        cost += d[D]*fmin;
    }

    g<<cost<<"\n";

    f.close();
    g.close();
    return 0;
}