Pagini recente » Cod sursa (job #2259034) | Monitorul de evaluare | Cod sursa (job #395998) | Cod sursa (job #419970) | Cod sursa (job #328156)
Cod sursa(job #328156)
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define MAX_N 360
#define inf 2147000000
int n, m, s, d, improve, sol;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N], cost[MAX_N][MAX_N];
int dist[MAX_N], tata[MAX_N], use[MAX_N], Q[MAX_N];
vector <int> v[MAX_N];
void cit() {
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &s, &d);
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
scanf("%d %d", &C[x][y], &cost[x][y]);
cost[y][x] = -cost[x][y];
v[x].push_back(y);
v[y].push_back(x);
}
}
int bf() {
memset(Q, 0, sizeof(Q));
memset(use, 0, sizeof(use));
int st = 0, dr = 1;
Q[1] = s; use[s] = 1;
while (st != dr) {
st++;
if (st > n) st = 1;
int len = v[Q[st]].size();
for (int i = 0; i < len; i++) {
if (C[Q[st]][v[Q[st]][i]] > F[Q[st]][v[Q[st]][i]] && dist[v[Q[st]][i]] > dist[Q[st]] + cost[Q[st]][v[Q[st]][i]]) {
dist[v[Q[st]][i]] = dist[Q[st]] + cost[Q[st]][v[Q[st]][i]];
tata[v[Q[st]][i]] = Q[st];
if (!use[v[Q[st]][i]]) {
dr++;
if (dr > n) dr = 1;
Q[dr] = v[Q[st]][i];
use[v[Q[st]][i]] = 1;
}
}
}
use[Q[st]] = 0;
}
if (dist[d] < inf) {
improve = 1;
int flux = inf;
for (int i = d; i != s; i = tata[i])
flux = min(flux, C[tata[i]][i] - F[tata[i]][i]);
for (int i = d; i != s; i = tata[i]) {
F[tata[i]][i] += flux;
F[i][tata[i]] -= flux;
}
return flux * dist[d];
}
return 0;
}
void solve() {
improve = 1;
while (improve) {
improve = 0;
for (int i = 1; i <= n; i++) {
dist[i] = inf;
tata[i] = -1;
}
dist[s] = 0;
sol += bf();
}
printf("%d\n", sol);
}
int main() {
cit();
solve();
return 0;
}