Pagini recente » Cod sursa (job #450087) | Cod sursa (job #2871384) | Cod sursa (job #1364881) | Cod sursa (job #2515028) | Cod sursa (job #2829603)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#define inf 1000000000
#define MAXN 355
#define sd short int
#define f first
#define s second
#define VIT vector <pair <sd, sd> > :: iterator
using namespace std;
bitset <MAXN> viz;
vector <pair <sd, sd> > G[MAXN];
int d[MAXN];
sd matCap[MAXN][MAXN], matflux[MAXN][MAXN];
int N, M, S, D;
sd dad[MAXN];
int sol;
inline bool BF ()
{
queue <int> Q;
int nod, i;
viz.reset ();
Q.push (S);
for (i = 1; i <= N; i++) {
dad[i] = 0;
d[i] = inf;
}
d[S] = 0;
while (!Q.empty ()) {
nod = Q.front ();
Q.pop ();
viz[nod] = 0;
for (VIT it = G[nod].begin (); it != G[nod].end (); it++)
if (matCap[nod][it -> f] > matflux[nod][it -> f] && d[it -> f] > d[nod] + it -> s) {
d[it -> f] = d[nod] + it -> s;
dad[it -> f] = nod;
if (viz[it -> f] == 0) {
viz[it -> f] = 1;
Q.push (it -> f);
}
}
}
return d[D] != inf;
}
int main ()
{
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);
scanf ("%d %d %d %d\n", &N, &M, &S, &D);
int i, fmin, nod;
sd x, y, cap, cost;
while (M--) {
scanf ("%hd %hd %hd %hd\n", &x, &y, &cap, &cost);
matCap[x][y] = cap;
G[x].push_back (make_pair (y, cost));
G[y].push_back (make_pair (x, -cost));
}
while (BF ()) {
nod = D;
fmin = inf;
for (i = nod; i != S; i = dad[i])
fmin = min (fmin, matCap[dad[i]][i] - matflux[dad[i]][i]);
if (fmin == 0) continue;
for (i = nod; i != S; i = dad[i]) {
// printf ("%d ->, ", i);
matflux[dad[i]][i] += fmin;
matflux[i][dad[i]] -= fmin;
}
// printf ("\n");
sol += d[D] * fmin;
// printf ("%d\n", sol);
}
printf ("%d\n", sol);
return 0;
}