Cod sursa(job #1515837)

Utilizator felixiPuscasu Felix felixi Data 2 noiembrie 2015 11:50:17
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstring>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream in("fmcm.in");
ofstream out("fmcm.out");

typedef long long I64;

const int NMAX = 350;
const int MMAX = 12500;
const int CMAX = 10000;
const int INF  = (1<<30);

vector <int> G[NMAX+2];
queue <int> Q;
int N, M, S, D;
int cap[NMAX+2][NMAX+2], cost[NMAX+2][NMAX+2];
int dist[NMAX+2];  bool viz[NMAX+2];
int tt[NMAX+2];

bool drum;

int BF( ) {
    for( int i = 0;  i <= NMAX;  ++i ) {
        tt[ i ] = -1;
        viz[ i ] = 0;
        dist[ i ] = INF;
    }
    while( !Q.empty() )  Q.pop();

    dist[ S ] = 0;
    Q.push( S );
    viz[ S ] = 1;

    while( !Q.empty() ) {
        int nod = Q.front();
        viz[nod] = 0;
        Q.pop();

        for( int i = 0;  i < (int)G[nod].size();  ++i ) {
            int x = G[nod][i];

            if( cap[nod][x] > 0 && dist[nod] + cost[nod][x] < dist[x] ) {
                dist[x] = dist[nod] + cost[nod][x];
                tt[x] = nod;

                if( viz[x] == 0 ) {
                    viz[x] = 1;
                    Q.push(x);
                }
            }


        }
    }

    if( dist[ D ] != INF ) {
        drum = 1;

        int minv = INF;
        for( int x = D;  x != S;  x = tt[x] ) {
            minv = min( minv, cap[ tt[x] ][ x ] );
        }

        for( int x = D;  x != S;  x = tt[x] ) {
            cap[ x ][ tt[x] ] += minv;
            cap[ tt[x] ][ x ] -= minv;
        }

        return minv * dist[ D ];
    }

    return 0;
}


int main() {
    in >> N >> M >> S >> D;
    for( int i = 1;  i <= M;  ++i ) {
        int x, y;
        in >> x >> y;
        in >> cap[x][y];
        in >> cost[x][y];
        cost[y][x] = -cost[x][y];

        G[x].push_back( y );
        G[y].push_back( x );
    }

    I64 sol = 0;
    I64 floox;
    drum = 1;
    while( drum ) {
        drum = 0;
        floox = BF();
        sol += floox;
    }
    out << sol << '\n';

    return 0;
}