Cod sursa(job #875216)

Utilizator vlad_DVlad Dumitriu vlad_D Data 9 februarie 2013 20:05:13
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 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 = 0; cost = 0;
    while (1) {
        int BFS[noduri];
        int 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);
}