Pagini recente » Cod sursa (job #2267957) | Cod sursa (job #3245866) | Cod sursa (job #2572814) | Cod sursa (job #3277183) | Cod sursa (job #1514715)
#include <fstream>
#include <deque>
#include <vector>
#define INF 100000010
#define DIM 352
using namespace std;
int C[DIM][DIM];
int F[DIM][DIM];
int Z[DIM][DIM];
int U[DIM];
int T[DIM];
int D[DIM];
vector<int> L[DIM];
deque<int> q;
int n, m, s, d, i, y, x, z, c, minim, u, cost, flux;
int bf() {
int nod, vecin;
for (int i=1;i<=n;i++) {
D[i] = INF;
U[i] = 0;
}
D[s] = 0;
U[s] = 1;
q.clear();
q.push_back(s);
while (!q.empty()) {
nod = q.front();
q.pop_front();
U[nod] = 0;
for (int i=0;i<L[nod].size();i++) {
vecin = L[nod][i];
if (C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Z[nod][vecin]) {
D[vecin] = D[nod] + Z[nod][vecin];
T[vecin] = nod;
if (U[vecin] == 0) {
q.push_back(vecin);
U[vecin] = 1;
}
}
}
}
if (D[d] != INF)
return 1;
else
return 0;
}
int main () {
ifstream fin ("fmcm.in");
ofstream fout("fmcm.out");
fin>>n>>m>>s>>d;
for (i=1;i<=m;i++) {
fin>>x>>y>>c>>z;
C[x][y] = c;
Z[x][y] = z;
Z[y][x] = -z; // pe munchia inversa se pune - costul muchiei date
L[x].push_back(y);
L[y].push_back(x);
}
while (bf()) {
minim = INF;
u = d;
while (u!=s) {
if (minim > C[ T[u] ][u] - F[ T[u] ][u])
minim = C[ T[u] ][u] - F[ T[u] ][u];
u = T[u];
}
u = d;
while (u!=s) {
cost += minim * Z[ T[u] ][u];
F[ T[u] ][u] += minim;
F[u][ T[u] ] -= minim;
u = T[u];
}
flux += minim;
}
fout<<cost;
return 0;
}