Cod sursa(job #1612919)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 25 februarie 2016 09:13:10
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>
#include<vector>
#include<queue>
#define INF 1000000000
using namespace std;
vector<int>L[510];
queue<int>q;
int n,m,s,ds,i,j,vmin,a,b,aa,bb,ss,sc,c[510][510],x[510][510],d[510],v[510],w[510][510],t[510];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int bf(){
    for(int i=1;i<=n;i++){
        d[i] = INF;
        v[i] = 0;
    }
    d[s]=0;
    v[s]=1;
    q.push(s);
    while( !q.empty() ){
        a = q.front();
        q.pop();
        v[a] = 0;
        for(int i=0; i<L[a].size(); i++){
            b=L[a][i];
            if( c[a][b] > w[a][b] && d[b] > d[a] + x[a][b] ){
                d[b] = d[a] + x[a][b];
                t[b] = a;
                if( ! v[b] ){
                    v[b] = 1;
                    q.push(b);
                }
            }
        }
    }
    return d[ds] != INF;
}
int main(){
    f=fopen("fmcm.in","r");
    g=fopen("fmcm.out","w");
    fscanf(f,"%d%d%d%d",&n,&m,&s,&ds);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d%d",&a,&b,&aa,&bb);
        L[a].push_back(b);
        L[b].push_back(a);
        c[a][b] = aa;
        x[a][b] = bb;
        x[b][a] = -bb;
    }
    while( bf() ){
        vmin = INF;
        a = ds;
        do{
            vmin = minim( vmin , c[ t[a] ][a] - w[ t[a] ][a] );
            a = t[a];
        }while( a != s );
        a = ds;
        do{
            ss += vmin * x[ t[a] ][a];
            w[ t[a] ][a] += vmin;
            w[a][ t[a] ] -= vmin;
            a = t[a];
        }while( a != s );

    }
    fprintf(g,"%d",ss);


    fclose(f);
    fclose(g);
    return 0;
}