Pagini recente » Istoria paginii runda/22_februarie_simulare_oji_2024_clasele_11_12/clasament | Cod sursa (job #676898) | Cod sursa (job #356940) | Cod sursa (job #1051540) | Cod sursa (job #2194789)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("fmcm.in");
ofstream out ("fmcm.out");
int total,n,m,s,d,a,b,e,coada[351*351],tata[351],hz[351],cap[351][351],f,c[351],flux[351][351],cost[351][351],st,dr;
vector<int>v[351];
bool bellmanford (int s, int d) {
coada[1] = s;
for (int i = 1; i <= n; i ++) {
c[i] = 0;
hz[i] = 0;
tata[i] = 0;
}
c[s] = 1;
hz[s] = 1;
for (st = 1, dr = 1; st <= dr; st ++) {
int a = coada[st];
for (int i = 0; i < v[a].size(); i ++) {
int b = v[a][i];
if (flux[a][b] < cap[a][b] && (c[b] > c[a] + cost[a][b] || tata[b] == 0)) {
if (hz[b] == 0) {
hz[b] = 1;
dr ++;
coada[dr] = b;
c[b] = c[a] + cost[a][b];
}
else {
c[b] = c[a] + cost[a][b];
}
tata[b] = a;
}
}
hz[a] = 0;
}
if (tata[d] != 0) {
return 1;
}
return 0;
}
int main (void) {
in >> n >> m >> s >> d;
for (int i = 1; i <= m; i ++) {
in >> a >> b >> f >> e;
v[a].push_back (b);
v[b].push_back (a);
cap[a][b] = f;
cost[a][b] = e;
cap[b][a] = 0;
cost[b][a] = -e;
}
while (bellmanford(s,d)) {
int x = d,minim = 1e9;
while (x != s) {
b = x;
a = tata[x];
minim = min (cap[a][b] - flux[a][b], minim);
x = tata[x];
}
x = d;
while (x != s) {
b = x;
a = tata[x];
flux[a][b] += minim;
flux[b][a] -= minim;
total += minim * (cost[a][b]);
x = tata[x];
}
}
out << total;
return 0;
}