Pagini recente » Cod sursa (job #370061) | Cod sursa (job #2636965) | Cod sursa (job #1597304) | Cod sursa (job #118393) | Cod sursa (job #1795238)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int NMAX = 360;
const int MMAX = 13000;
const int MULT = 15000;
int N, M, S, D;
vector<int> G[NMAX];
int capac[NMAX][NMAX];
int cost[NMAX][NMAX];
int flux[NMAX][NMAX];
int dist[NMAX];
int recon[NMAX];
int flag;
int
long long BellmanFordCheck () {
for (int i = 1; i <= N; i++) {
dist[i] = MULT;
recon[i] = -1;
}
dist[S] = 0;
int sf = 0;
while (!sf) {
sf = 1;
for (int i = 1; i <= N; i++) {
for (auto &it : G[i]) {
if (capac[i][it] - flux[i][it] > 0 && dist[i] + cost[i][it] < dist[it]) {
dist[it] = dist[i] + cost[i][it];
recon[it] = i;
sf = 0;
}
}
}
}
int add;
add = MULT;
flag = 1;
for (int i = D; i != S; i = recon[i]) {
add = min (add, capac[recon[i]][i] - flux[recon[i]][i]);
}
for (int i = D; i != S; i = recon[i]) {
flux[recon[i]][i] += add;
flux[i][recon[i]] -= add;
}
return add * dist[D];
}
long long fflux () {
long long ANS = 0;
flag = 1;
while (flag) {
flag = 0;
ANS += BellmanFordCheck();
}
return ANS;
}
int main ()
{
ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
fin >> N >> M >> S >> D;
for (int i = 1; i <= M; i++) {
int x, y, c, z;
fin >> x >> y >> c >> z;
G[x].push_back(y);
G[y].push_back(x);
capac[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
fout << fflux();
return 0;
}