Pagini recente » Cod sursa (job #2044264) | Statistici Moldovan Reka (breki) | Cod sursa (job #2181716) | Cod sursa (job #2684036) | Cod sursa (job #1206794)
#include <fstream>
#include <vector>
#include <queue>
#define DIMN 351
#define INF 1000000000
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
vector<int> L[DIMN];
int C[DIMN][DIMN], F[DIMN][DIMN], D[DIMN], cost[DIMN][DIMN], T[DIMN];
int q[DIMN];
int n,m,s,d,p,u,x,y,c,z;
bool ok, viz[DIMN];
int BF() {
queue<int> q;
for (int i=1; i<=n; ++i) {
D[i] = INF;
viz[i] = 0;
}
p = u = 1;
q.push(s);
D[s] = 0;
viz[s] = 1;
while (!q.empty()) {
int nod = q.front();
q.pop();
viz[nod] = 0;
for (vector<int>::iterator it=L[nod].begin(); it!=L[nod].end(); it++)
if (C[nod][*it] - F[nod][*it] > 0 && D[*it] > D[nod] + cost[nod][*it]) {
D[*it] = D[nod] + cost[nod][*it];
if (!viz[*it]) {
viz[*it] = 1;
q.push(*it);
}
T[*it] = nod;
}
}
if (D[d] != INF) {
ok = 1;
int Min = INF;
for (int i=d; i!=s; i=T[i])
Min = min(Min, C[T[i]][i] - F[T[i]][i]);
for (int i=d; i!=s; i=T[i]) {
F[T[i]][i] += Min;
F[i][T[i]] -= Min;
}
return Min * D[d];
}
return 0;
}
int main() {
f >> n >> m >> s >> d;
for (int i=1; i<=m; ++i) {
f >> x >> y >> c >> z;
L[x].push_back(y);
L[y].push_back(x);
C[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
int ans = 0;
ok = 1;
while (ok) {
ok = 0;
ans += BF();
}
g << ans << "\n";
return 0;
}