Cod sursa(job #650023)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 17 decembrie 2011 10:58:13
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
#include<vector>
using namespace std;

const int N = 501;

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 q[1000010],l,st;

int bf() {
    vector<int>::iterator it;
    int i;
    st=l=1;
    q[st]=s;

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

    fol[s]=true;
    dist[s]=0;

    while(st<=l) {

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

                dist[*it] = dist[q[st]] + cos[q[st]][*it];
                p[*it]=q[st];

                if(!fol[*it]) {
                    fol[*it]=true;
                    q[++l]=*it;
                }
            }

        fol[q[st]]=false;
        ++st;
    }

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

        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;
}

inline long long cflux() {
    long long 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);
        v[b].push_back(a);

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

    out << cflux();

    return 0;
}