Pagini recente » Cod sursa (job #412625) | Cod sursa (job #1477937) | Cod sursa (job #1134404) | Cod sursa (job #2286587) | Cod sursa (job #238538)
Cod sursa(job #238538)
#include <cstdio>
#include <cassert>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define MAXN 355
int N, M, S, D;
int C[MAXN][MAXN], Cst[MAXN][MAXN];
vector<int> con[MAXN];
int F, FCst;
int d[MAXN], p[MAXN]; char inQ[MAXN];
queue<int> Q;
inline int bellmanFord()
{
memset(d, 0x3f, sizeof(d));
d[S] = 0;
for (Q.push(S), inQ[S] = 1; !Q.empty(); Q.pop())
{
vector<int> :: iterator it;
int i = Q.front();
inQ[i] = 0;
for (it = con[i].begin(); it != con[i].end(); it++)
if (C[i][*it])
{
if (d[i] + Cst[i][*it] >= d[*it])
continue;
d[*it] = d[i] + Cst[i][*it];
p[*it] = i;
if (inQ[*it])
continue;
inQ[*it] = 1;
Q.push(*it);
}
}
if (d[D] == 0x3f3f3f3f)
return false;
int Min = 0x3f3f3f3f;
for (int aux = D; aux != S; aux = p[aux])
Min = min(Min, C[p[aux]][aux]);
F += Min;
FCst += Min * d[D];
for (int aux = D; aux != S; aux = p[aux])
C[p[aux]][aux] -= Min,
C[aux][p[aux]] += Min;
return true;
}
int main()
{
freopen("fmcm.in", "rt", stdin);
freopen("fmcm.out", "wt", stdout);
assert(scanf("%d %d %d %d", &N, &M, &S, &D) == 4);
assert(1 <= N && N <= 350);
assert(1 <= M && M <= 12500);
assert(1 <= S && S <= N);
assert(1 <= D && D <= N);
assert(S != D);
for (; M; M--)
{
int x, y;
assert(scanf("%d %d ", &x, &y) == 2);
assert(1 <= x && x <= N);
assert(1 <= y && y <= N);
assert(x != y && !C[x][y] && !Cst[x][y] && !C[y][x] && !Cst[y][x]);
assert(x != D && y != S);
con[x].push_back(y);
con[y].push_back(x);
assert(scanf("%d %d", C[x] + y, Cst[x] + y) == 2);
assert(1 <= C[x][y] && C[x][y] <= 10000);
assert(-1000 <= Cst[x][y] && Cst[x][y] <= 1000);
Cst[y][x] = -Cst[x][y];
}
F = FCst = 0;
for (; bellmanFord(); );
printf("%d\n", FCst);
return 0;
}