Cod sursa(job #649075)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 15 decembrie 2011 11:11:10
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
#include<queue>
#include<vector>
using namespace std;

const int N = 351;

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

int n,m,s,d,f[N][N],c[N][N],cos[N][N],drum=1,p[N],dist[N];
bool fol[N];
vector<int> v[N];

int bf() {
    vector<int>::iterator it;
    queue<int> q;
    int i;

    for(i=1;i<=n;++i) {
        fol[i]=false;
        p[i]=0;
        dist[i]=1<<25;
    }

    q.push(s);
    fol[s]=true;
    dist[s]=0;

    while(!q.empty()) {

        for(it=v[q.front()].begin() ; it!=v[q.front()].end() ; ++it)
            if(c[q.front()][*it] - f[q.front()][*it] > 0 && dist[*it] > dist[q.front()] + cos[q.front()][*it]) {

                dist[*it] = dist[q.front()] + cos[q.front()][*it];
                p[*it]=q.front();

                if(!fol[*it]) {
                    fol[*it]=true;
                    q.push(*it);
                }
            }

        fol[q.front()]=false;
        q.pop();
    }

    if(dist[d]!=(1<<25)) {
        drum=1;
        int vmin=1<<25;

        for(i=d ; i!=s ; i=p[i])
            if(c[p[i]][i] - f[p[i]][i]<vmin)
                vmin = c[p[i]][i] - f[p[i]][i];

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

        return vmin * dist[d];
    }

    return 0;
}

int cflux() {
    int cm=0;

    while(drum) {
        drum=0;

        cm+=bf();
    }

    return cm;
}

int main() {
    int i,a,b,cap,cost;

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

    for(i=1;i<=m;++i) {

        in >> a >> b >> cap >> cost;

        v[a].push_back(b);

        c[a][b]=cap;
        cos[a][b]=cost;
        cos[b][a]=-cost;
    }

    out << cflux();

    return 0;
}