Pagini recente » Cod sursa (job #2155447) | Cod sursa (job #576514) | Cod sursa (job #2011882) | Cod sursa (job #221317) | Cod sursa (job #309945)
Cod sursa(job #309945)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
#define NUME "fmcm"
ifstream fi(NUME".in");
ofstream fo(NUME".out");
#define MAXN 351
#define INF 0x3f3f3f3f
int N, M, S, D;
struct list { int nod, cost; list *r; } *L[MAXN];
int F[MAXN][MAXN], C[MAXN][MAXN];
int Dist[MAXN], T[MAXN], U[MAXN], inque[MAXN];
#define avail(i, j) (C[i][j] - F[i][j])
int bellman(int S, int D)
{
memset(Dist, INF, sizeof(T));
memset(U, 0, sizeof(T));
memset(inque, 0, sizeof(T));
queue<int> Q;
Q.push(S);
Dist[S] = 0;
while (!Q.empty()) {
int x = Q.front();
U[x] ++;
Q.pop(); inque[x] = 0;
if (U[x] == N) // ciclu
return INF;
for (list *p = L[x]; p; p = p->r) {
if (avail(x, p->nod) > 0 && Dist[p->nod] > Dist[x] + p->cost) {
Dist[p->nod] = Dist[x] + p->cost;
T[p->nod] = x;
if (inque[p->nod] == 0)
inque[p->nod] = 1, Q.push(p->nod);
}
}
}
return Dist[D];
}
void push(int x, int y, int c) {
list *p = new list;
*p = (list) { y, c, L[x] };
L[x] = p;
}
void fluxul(int S, int D)
{
int f, c, r, dist, i;
for (f = c = 0; (dist = bellman(S, D)) != INF; f += r, c += r*dist) {
r = INF;
for (i = D; i != S; i = T[i])
r = min(r, avail(T[i], i));
for (i = D; i != S; i = T[i])
F[ T[i] ][i] += r, F[i][ T[i] ] -= r;
}
fo << c << "\n";
}
void citirea()
{
int i;
fi >> N >> M >> S >> D;
while (M--) {
int x, y, c, cost;
fi >> x >> y >> c >> cost;
push(x, y, cost);
push(y, x, -cost);
C[x][y] = c;
}
}
int main()
{
citirea();
fluxul(S, D);
return 0;
}