Pagini recente » Cod sursa (job #1639913) | Cod sursa (job #1799616) | Cod sursa (job #2676164) | Cod sursa (job #2386530) | Cod sursa (job #2469474)
#include <fstream>
#include <deque>
#include <vector>
#include <bitset>
#define inf 12500000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n, m, s, d, sol, a, b, ca, co, nod, minim, tata, t[352], total[352], cap[352][352], cost[352][352], flux[352][352], i;
bitset<352> f;
deque<int> coada;
vector<int> v[352];
bool bellmanford(){
f.reset();
f[s] = 1;
coada.push_back(s);
for(int i = 1;i<=n;i++)
total[i] = inf;
total[s] = 0;
int ok = 0;
while(!coada.empty()){
int p = coada[0];
f[p] = 0;
coada.pop_front();
for(int i = 0;i<v[p].size();i++){
int vecin = v[p][i];
if(cap[p][vecin] > flux[p][vecin] && total[vecin] > total[p] + cost[p][vecin]){
total[vecin] = total[p] + cost[p][vecin];
t[vecin] = p;
if(f[vecin] == 0){
f[vecin] = 1;
coada.push_back(vecin);
}
if(vecin == d)
ok = 1;
}
}
}
return ok;
}
int main(){
fin>>n>>m>>s>>d;
for(i=1;i<=m;i++){
fin>>a>>b>>ca>>co;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = ca;
cost[a][b] = co;
cost[b][a] = -co;
}
while(bellmanford()){
nod = d, tata = t[nod];
minim = cap[tata][nod];
while(tata){
minim = min(minim, cap[tata][nod] - flux[tata][nod]);
nod = tata;
tata = t[nod];
}
nod = d, tata = t[nod];
while(tata){
flux[tata][nod] += minim;
flux[nod][tata] -= minim;
nod = tata;
tata = t[nod];
}
sol += total[d]*minim;
}
fout<<sol;
return 0;
}