Pagini recente » Cod sursa (job #1080707) | Cod sursa (job #1535663) | Cod sursa (job #1517606) | Cod sursa (job #2608443) | Cod sursa (job #1518009)
#include<fstream>
#include<vector>
#include<deque>
#include<bitset>
using namespace std;
int n, m, x, y, a, cost, u, minim, s, d, i, sum;
int c[355][355], f[355][355], z[355][355], sd[355], t[355];
vector<int> v[355];
bitset<355> viz;
deque<int> cd;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int bf(){
int i, nod, vecin;
int ok = 0;
for(i = 1; i <= n; i++){
sd[i] = 1000000000;
viz[i] = 0;
}
cd.clear();
viz[s] = 1;
cd.push_back(s);
sd[s] = 0;
while( !cd.empty()){
nod = cd.front();
viz[nod] = 0;
for(i = 0; i < v[nod].size(); i++){
vecin = v[nod][i];
if(sd[vecin] > sd[nod] + z[nod][vecin] && f[nod][vecin] < c[nod][vecin]){
sd[vecin] = sd[nod] + z[nod][vecin];
t[vecin] = nod;
if(viz[vecin] == 0){
viz[vecin] = 1;
cd.push_back(vecin);
}
if(vecin == d){
ok = 1;
}
}
}
cd.pop_front();
}
return ok;
}
int main(){
fin>> n >> m >> s >> d;
for(i = 1; i <= m; i++){
fin>> x >> y >> a >> cost;
v[x].push_back(y);
v[y].push_back(x);
c[x][y] = a;
z[x][y] = cost;
z[y][x] = -cost;
}
while( bf() ){
minim = 1000000000;
for(u = d; t[u] > 0; u = t[u]){
minim = min(minim, c[ t[u] ][u] - f[ t[u] ][u]);
}
for(u = d; t[u] > 0; u = t[u]){
f[ t[u] ][u] += minim;
f[u][ t[u] ] -= minim;
sum += minim * z[ t[u] ][u];
}
}
fout<< sum <<"\n";
return 0;
}