Cod sursa(job #1517987)

Utilizator robx12lnLinca Robert robx12ln Data 5 noiembrie 2015 09:32:25
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<vector>
#include<deque>
#define INF 1000000000
#define DIM 355
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int D[DIM] , V[DIM] , C[DIM][DIM] , F[DIM][DIM] , T[DIM] , Z[DIM][DIM];
int n,m,d,s;
vector<int> L[DIM];
deque<int> q;
int bf(){
    int nod,vecin,ok=0;
    q.push_back(s);
    for(int i=1;i<=n;i++){
        D[i] = INF;
    }
    V[s]=1;
    D[s]=0;
    while ( ! q.empty() ){

        nod = q.front();

        for(int i = 0 ; i < L[nod].size() ; i++ ){
            vecin = L[nod][i];
            if( D[vecin] > D[nod] + Z[nod][vecin] && C[nod][vecin] > F[nod][vecin] ){
                D[vecin] = D[nod] + Z[nod][vecin];
                T[vecin] = nod;
                if( V[vecin] == 0 ){
                    V[vecin] = 1;
                    q.push_back(vecin);
                    if( vecin == d ) ok=1;
                }
            }
        }

        V[nod]=0;
        q.pop_front();
    }

    return ok;
}
int x,y,c,z,minim;
int main(){
    fin>>n>>m>>s>>d;
    for(int i=1;i<=m;i++){
        fin>>x>>y>>c>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=c;
        Z[x][y]=z;
        Z[y][x]=-z;
    }
    int flux=0,cost=0;
    while ( bf() == 1 ){
        minim = INF ;
        for( int i = d ; i != s ; i=T[i]  ){
            minim=min( minim , C[ T[i] ][i] - F[ T[i] ][i] );
        }
        flux+=minim;
        for( int i = d ; i != s ; i=T[i]  ){
            F[ T[i] ][i] += minim;
            F[i][ T[i] ] -= minim;
            cost += minim * Z[ T[i] ][i];
        }
    }
    fout<<cost<<"\n";
    return 0;
}