Cod sursa(job #875213)

Utilizator vlad_DVlad Dumitriu vlad_D Data 9 februarie 2013 20:02:58
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>

using namespace std;

namespace mfc {
#define noduri 351
#define INF 99999999
#define pb(a) push_back(a)
vector<vector<int> > G;
int CAP[noduri][noduri];
int P[noduri][noduri];
int N;
void max_flow_cost(int &flow, int &cost, int sursa, int sink) {
  flow = cost = 0;
  while (1) {
    int BFS[noduri], D[noduri], U[noduri];
    for (int i = 0; i <= N; ++i) {
      BFS[i] = U[i] = 0;
      D[i] = INF;
    }

    D[sursa] = 0; U[sursa] = 1;
    queue<int> Q;
    Q.push(sursa);
    while (!Q.empty()) {
      int nod = Q.front(); Q.pop();
      for (int i = 0; i < G[nod].size(); ++i) {
        int nod2 = G[nod][i];
        if (CAP[nod][nod2] <= 0 || D[nod2] <= D[nod] + P[nod][nod2]) continue;
        D[nod2] = D[nod] + P[nod][nod2];
        BFS[nod2] = nod;
        if (!U[nod2]) { Q.push(nod2); U[nod2] = 1; }
      }
      U[nod] = 0;
    }
    if (D[sink] == INF) return;
    int cresc = INF;
    for (int i = sink; i != sursa; i = BFS[i]) cresc = min(cresc, CAP[BFS[i]][i]);
    flow += cresc;
    cost += cresc * D[sink];
    for (int i = sink; i != sursa; i = BFS[i]) {
      CAP[BFS[i]][i] -= cresc;
      CAP[i][BFS[i]] += cresc;
    }
  }
}
void clear() {
  G.clear(); memset(CAP, 0, sizeof(CAP)); memset(P, 0, sizeof(P)); N = 0;
}
void adapt();
} // namespace max-flow-cost

namespace in {
  int N, M, S, D;
  int ret[12501][4];
}

using namespace in;

int main() {
  freopen("mfcm.in", "r", stdin);
  freopen("mfcm.out", "w", stdout);
  scanf("%d %d %d %d", &N, &M, &S, &D);
  for (int i = 1; i <= M; ++i) scanf("%d %d %d %d", &ret[i][0], &ret[i][1], &ret[i][2], &ret[i][3]);
  mfc::adapt();
  return 0;
}
void mfc::adapt() {
  N = in::N;
  G.resize(N + 1);
  for (int i = 1; i <= M; ++i) {
    G[ret[i][0]].pb(ret[i][1]); G[ret[i][1]].pb(ret[i][0]);
    CAP[ret[i][0]][ret[i][1]] = ret[i][2];
    P[ret[i][0]][ret[i][1]] = ret[i][3];
    P[ret[i][1]][ret[i][0]] = -ret[i][3];
  }
  int flow, cost;
  max_flow_cost(flow, cost, in::S, in::D);
  printf("%d\n", cost);
}