Cod sursa(job #2066037)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 14 noiembrie 2017 17:48:50
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
# include <iostream>
# include <fstream>
# include <vector>
# include <queue>

using namespace std;

const int MAX_N = 350;
const int INF = 2e9;

int flow[1 + MAX_N][1 + MAX_N];
int cost[1 + MAX_N][1 + MAX_N];
int dist[1 + MAX_N], from[1 + MAX_N];
vector<int> edges[1 + MAX_N];

int main() {
    ifstream fin( "fmcm.in" );
    ofstream fout( "fmcm.out" );

    int n, m, S, D;
    fin >> n >> m >> S >> D;

    for ( int i = 0; i < m; i ++ ) {
      int u, v, c, z;
      fin >> u >> v >> c >> z;

      flow[u][v] = c;
      cost[u][v] = z;
      cost[v][u] = -z;
      edges[u].push_back( v );
      edges[v].push_back( u );
    }

    bool improve = true;
    int f = 0, c = 0;
    do {
      for ( int i = 1; i <= n; i ++ )
        dist[i] = INF;
      dist[S] = 0;

      queue<int> bellman;
      bellman.push( S );
      while ( bellman.size() ) {
        int u = bellman.front();
        bellman.pop();

        for ( int v : edges[u] )
          if ( flow[u][v] && dist[u] + cost[u][v] < dist[v] ) {
            dist[v] = dist[u] + cost[u][v];
            from[v] = u;
            bellman.push( v );
          }
      }

      if ( dist[D] != INF ) {
        int mflow = INF;
        for ( int i = D; i != S; i = from[i] )
          mflow = min( mflow, flow[from[i]][i] );
        for ( int i = D; i != S; i = from[i] ) {
          flow[from[i]][i] -= mflow;
          flow[i][from[i]] += mflow;
        }
        f += mflow;
        c += dist[D] * mflow;
      } else
        improve = false;
    } while ( improve );

    fout << c;

    return 0;
}