Cod sursa(job #2071993)

Utilizator robx12lnLinca Robert robx12ln Data 21 noiembrie 2017 11:43:11
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int INF = 0x3f3f3f3f;
int n, m, s, d, f[355], costFlux, minim;
int Cst[355][355], F[355][355], C[355][355];
int old_Dist[355], D[355], real_Dist[355], T[355];
vector<int> v[355];
queue<int> Dq;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q;
bool bfs(){
    memset( D, INF, sizeof( D ) );
    memset( real_Dist, INF, sizeof( real_Dist ) );
    memset( T, 0, sizeof(T) );
    D[s] = 0; real_Dist[s] = 0;
    q.push( make_pair( D[s], s ) );
    while( !q.empty() ){
        int nod = q.top().second;
        int dist = q.top().first;
        q.pop();
        if( dist != D[nod] )
            continue;
        for( int i = 0; i < v[nod].size(); i++ ){
            int vecin = v[nod][i];
            if( C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Cst[nod][vecin] + old_Dist[nod] - old_Dist[vecin] ){
                D[vecin] = D[nod] + Cst[nod][vecin] + old_Dist[nod] - old_Dist[vecin];
                real_Dist[vecin] = real_Dist[nod] + Cst[nod][vecin];
                T[vecin] = nod;
                q.push( make_pair( D[vecin], vecin ) );
            }
        }
    }
    memcpy( old_Dist, real_Dist, sizeof(real_Dist) );
    if( D[d] == INF )
        return false;
    return true;
}
int main(){
    fin >> n >> m >> s >> d;
    for( int i = 1; i <= m; i++ ){
        int a, b, c, z;
        fin >> a >> b >> c >> z;
        C[a][b] = c;
        Cst[a][b] = z; Cst[b][a] = -z;
        v[a].push_back( b );
        v[b].push_back( a );
    }
    memset( old_Dist, INF, sizeof(old_Dist) );
    Dq.push( s ); old_Dist[s] = 0; f[s] = 1;
    while( !Dq.empty() ){
        int nod = Dq.front();
        for( int i = 0; i < v[nod].size(); i++ ){
            int vecin = v[nod][i];
            if( C[nod][vecin] > F[nod][vecin] && old_Dist[vecin] > old_Dist[nod] + Cst[nod][vecin] ){
                old_Dist[vecin] = old_Dist[nod] + Cst[nod][vecin];
                if( f[vecin] == 0 ){
                    f[vecin] = 1;
                    Dq.push( vecin );
                }
            }
        }
        f[nod] = 0;
        Dq.pop();
    }
    while( bfs() == true ){
        minim = INF;
        for( int nod = d; nod != s; nod = T[nod] )
            minim = min( minim, C[ T[nod] ][nod] - F[ T[nod] ][nod] );
        costFlux += minim * real_Dist[d];
        for( int nod = d; nod != s; nod = T[nod] ){
            F[ T[nod] ][nod] += minim;
            F[nod][ T[nod] ] -= minim;
        }
    }
    fout << costFlux << "\n";
    return 0;
}