Pagini recente » Cod sursa (job #2698161) | Cod sursa (job #2697767) | Cod sursa (job #449691) | Cod sursa (job #2442010) | Cod sursa (job #932936)
Cod sursa(job #932936)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
#define nmax 351
#define Mmax 12505
#define inf (1<<30)
int n, m, S, D, dist[nmax], cost[nmax][nmax], capac[nmax][nmax], flux[nmax][nmax], t[nmax];
bool viz[nmax];
vector<int> gf[nmax];
int q[nmax+Mmax];
void citeste(){
f >> n >> m >> S >> D;
int x, y, c, z;
for(int i=1; i<=m; ++i){
f >> x >> y >> c >> z;
gf[x].push_back(y);
gf[y].push_back(x);
capac[x][y] = c; cost[x][y] = z; cost[y][x] = -z;
}
}
inline int bf(int S, int D){
for(int i=0; i<nmax; ++i) viz[i] = 0, dist[i] = inf;
dist[S] = 0;
int st = 1; int dr = 0;
q[++dr] = S; viz[S] = 1;
for(; st<=dr; ){
int nod = q[st]; ++st;
viz[nod] = 0;
for(int i=0; i<gf[nod].size(); ++i){
int vc = gf[nod][i];
if (dist[vc] > dist[nod] + cost[nod][vc] && capac[nod][vc] > flux[nod][vc]){
t[vc] = nod;
dist[vc] = dist[nod] + cost[nod][vc];
if (viz[vc] == 0){
viz[vc] = 1; q[++dr] = vc;
}
}
}
}
return dist[D];
}
void rezolva(){
int Flux = 0;
for(int ok=1; ok!=0; ){
int Cost = bf(S, D);
if (Cost == inf) break;
int Min = inf;
for(int i=D; i!=S; i=t[i]){
Min = min(Min, capac[ t[i] ][i] - flux[ t[i] ][i]);
}
for(int i=D; i!=S; i=t[i]){
flux[ t[i] ][i] += Min;
flux[i][ t[i] ] -= Min;
}
Flux += Min * Cost;
}
cout << Flux << "\n";
g << Flux << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}