Cod sursa(job #1517893)

Utilizator DeltaMTP Dragos DeltaM Data 4 noiembrie 2015 23:14:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>
#include<vector>
#include<queue>
#define INF 2000000000
using namespace std;
vector<int>L[400];
queue<int>q;
int n,m,s,d,a,b,aa,bb,i,j,ss,c[400][400],z[400][400],v[400],t[400],D[400],x[400][400];
FILE *f,*g;
int bf(){
    for(int i = 1 ; i <= n ; i++){
        D[i] = INF;
        v[i] = 0;
    }
    q.push(s);
    D[s] = 0;
    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( D[b] > D[a] + z[a][b] && c[a][b] > x[a][b] ){
                D[b] = D[a] + z[a][b];
                t[b] = a;
                if( v[b] == 0 ){
                    q.push(b);
                    v[b] = 1;
                }
            }
        }
    }
    return D[d] != INF;
}
int main(){
    f = fopen("fmcm.in","r");
    g = fopen("fmcm.out","w");
    fscanf( f , "%d%d%d%d", &n , &m , &s , &d );
    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;
        z[a][b] = bb;
        z[b][a] = - bb;
    }
    while(bf()){
        aa = INF;
        a = d;
        while( t[a] != 0 ){
            if( aa > c[ t[a] ][a] - x[ t[a] ][a] )
                aa = c[ t[a] ][a] - x[ t[a] ][a];
            a=t[a];
        }
        a = d;
        while( t[a] != 0 ){
            ss += aa * z[ t[a] ][a];
            x[ t[a] ][a] += aa;
            x[a][ t[a] ] -= aa;
            a = t[a];
        }
    }
    fprintf( g , "%d" , ss );




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