Pagini recente » Cod sursa (job #546390) | Cod sursa (job #2329286) | Cod sursa (job #62688) | Cod sursa (job #3222539) | Cod sursa (job #875213)
Cod sursa(job #875213)
#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);
}