Pagini recente » Cod sursa (job #1345882) | Cod sursa (job #268477) | Cod sursa (job #2538757) | Cod sursa (job #1802842) | Cod sursa (job #540538)
Cod sursa(job #540538)
#include <cstdio>
#include <vector>
using namespace std;
const int N = 356;
const int INF = 0x3f3f3f3f;
struct tip{int nod, cost;} ;
int f[N][N], n, m, DIST[N], S, D, c[N][N];
vector<tip> a[N];
long long BELLMAN_FORD() {
int i, j, t[N], v[N], cost, cap, k, x;
for(i = 1; i <= n; ++i) {
DIST[i] = INF;
t[i] = 0;
v[i] = 0;
}
v[S] = 1;
DIST[S] = 0;
int cd[N];
cd[0] = 1; cd[1] = S;
for(j = 1; j <= cd[0]; ++j) {
k = cd[j];
for(i = 0; i < a[k].size(); ++i) {
x = a[k][i].nod;
cost = a[k][i].cost;
if(f[k][x] < c[k][x] && DIST[k] + cost < DIST[x]) {
DIST[x] = DIST[k] + cost;
t[x] = k;
if(!v[x]) {
cd[++cd[0]] = x;
v[x] = 1;
}
}
}
v[k] = 0;
}
int r;
if(DIST[D] != INF) {
k = D;
r = INF;
while(k != S) {
r = min(r, c[t[k]][k] - f[t[k]][k]);
k = t[k];
}
k = D;
while(k != S) {
f[k][t[k]] -= r;
f[t[k]][k] += r;
k = t[k];
}
return (long long)r * DIST[D];
}
return 0;
}
int main() {
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
int i, y, cap, cost, x;
tip w;
scanf("%d %d %d %d", &n, &m, &S, &D);
for(i = 1; i <= m; ++i) {
scanf("%d %d %d %d", &x, &y, &cap, &cost);
w.nod = y; w.cost = cost;
c[x][y] = cap;
a[x].push_back(w);
w.nod = x;
w.cost = - cost;
a[y].push_back(w);
}
long long ct = 0;
long long X = 1;
while(X) {
X = BELLMAN_FORD();
ct += X;
}
printf("%I64d\n", ct);
return 0;
}