Pagini recente » Cod sursa (job #3216375) | Cod sursa (job #1660778) | Cod sursa (job #1609515) | Cod sursa (job #1674164) | Cod sursa (job #1536981)
#include <stdio.h>
#include <vector>
#include <queue>
#define maxdim 353
using namespace std;
int n, m, source, dest;
int viz[maxdim], dist[maxdim], T[maxdim];
int cap[maxdim][maxdim], f[maxdim][maxdim], cost[maxdim][maxdim];
vector<int> G[maxdim];
int bf() {
queue<int> q;
for (int i = 1; i <= n; ++i) {
viz[i] = 0;
dist[i] = 1<<29;
}
q.push(source);
viz[source] = 1;
dist[source] = 0;
while (!q.empty()) {
int nod = q.front(); q.pop(); viz[nod] = 0;
for (int vecin : G[nod]) {
if (cap[nod][vecin] > f[nod][vecin] && dist[vecin] > dist[nod] + cost[nod][vecin]) {
dist[vecin] = dist[nod] + cost[nod][vecin];
T[vecin] = nod;
q.push(vecin);
viz[vecin] = 1;
}
}
}
return dist[dest];
}
int main() {
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &source, &dest);
for (int i = 1; i <= m; ++i) {
int x, y, c, z;
scanf("%d %d %d %d", &x, &y, &c, &z);
G[x].push_back(y); cap[x][y] = c; cost[x][y] = z;
G[y].push_back(x); cost[y][x] = -z;
}
int sol = 0;
while (bf() != (1<<29)) {
int nod = dest;
int maxf = 1<<29, minc = 0;
while (nod != source) {
maxf = min(maxf, cap[T[nod]][nod] - f[T[nod]][nod]);
minc += cost[T[nod]][nod];
nod = T[nod];
}
nod = dest;
while (nod != source) {
f[T[nod]][nod] += maxf;
f[nod][T[nod]] -= maxf;
nod = T[nod];
}
sol += maxf * minc;
}
printf("%d\n", sol);
return 0;
}