Pagini recente » Cod sursa (job #980460) | Cod sursa (job #2554430) | Cod sursa (job #536042) | Cod sursa (job #537103) | Cod sursa (job #1241473)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int N, M, S, D, flow, fmin, bell[355], cum[355], f[355][355], C[355][355], bani[355][355];
vector < int > v[355];
queue < int > cc;
void bellman()
{
for (int i=1; i<=N; i++)
bell[i] = 1<<28;
bell[S] = 0;
cc.push(S);
while (!cc.empty())
{
int nod = cc.front();
cc.pop();
for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
if (f[nod][*it] < C[nod][*it] && bell[*it] > bell[nod] + bani[nod][*it])
{
bell[*it] = bell[nod] + bani[nod][*it];
cum[*it] = nod;
cc.push(*it);
}
}
}
int main()
{
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);
scanf ("%d %d %d %d", &N, &M, &S, &D);
for (int i=1; i<=M; i++)
{
int X, Y, Z, c;
scanf ("%d %d %d %d", &X, &Y, &c, &Z);
v[X].push_back(Y);
v[Y].push_back(X);
C[X][Y] = c;
bani[X][Y] = Z;
bani[Y][X] = -Z;
}
while (1)
{
bellman();
if (bell[D] >= (1<<28)) break;
fmin = (1<<28);
for (int i = D; i != S; i = cum[i])
if (C[cum[i]][i] - f[cum[i]][i] < fmin)
fmin = C[cum[i]][i] - f[cum[i]][i];
flow += fmin * bell[D];
for (int i = D; i != S; i = cum[i])
{
f[cum[i]][i] += fmin;
f[i][cum[i]] -= fmin;
}
}
printf ("%d\n", flow);
return 0;
}