Pagini recente » Cod sursa (job #1755199) | Cod sursa (job #2935539) | Cod sursa (job #444218) | Cod sursa (job #1773975) | Cod sursa (job #424141)
Cod sursa(job #424141)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define Nmax 355
#define INF 0x3f3f3f3f
int n, m, S, D, sol;
int F[Nmax][Nmax], Cst[Nmax][Nmax], C[Nmax], T[Nmax];
vector <int> V[Nmax];
void citire () {
int a, b, c, d, i;
scanf ("%d %d %d %d", &n, &m, &S, &D);
for (i = 1; i <= m; i++) {
scanf ("%d %d %d %d", &a, &b, &c, &d);
V[a].push_back (b); V[b].push_back (a);
F[a][b] = c;
Cst[a][b] = d; Cst[b][a] = -d;
}
}
int Bellman_Ford () {
queue <int> Q;
int viz[Nmax];
int nod, fiu, i, N;
memset (viz, 0, sizeof (viz));
memset (C, INF, sizeof (C));
C[S] = 0; viz[S] = 1;
for (Q.push (S); !Q.empty (); Q.pop ()) {
nod = Q.front ();
viz[nod] = 0;
for (i = 0, N = V[nod].size (); i < N; i++) {
fiu = V[nod][i];
if (F[nod][fiu] && C[fiu] > C[nod] + Cst[nod][fiu]) {
C[fiu] = C[nod] + Cst[nod][fiu];
T[fiu] = nod;
if (!viz[fiu])
Q.push (fiu), viz[fiu] = 1;
}
}
}
if (C[D] == INF)
return 0;
return 1;
}
int main () {
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);
citire ();
int nod, Fmin;
while ( Bellman_Ford () ) {
Fmin = 1 << 30;
for (nod = D; nod != S; nod = T[nod]) Fmin = min (Fmin, F[ T[nod] ][ nod ]);
for (nod = D; nod != S; nod = T[nod]) {
F[T[nod]][nod]-= Fmin;
F[nod][T[nod]]+= Fmin;
}
sol+= C[D] * Fmin;
}
printf ("%d", sol);
return 0;
}