Pagini recente » Cod sursa (job #141560) | Cod sursa (job #1240482) | Cod sursa (job #1817645) | Cod sursa (job #1505221) | Cod sursa (job #1517987)
#include<fstream>
#include<vector>
#include<deque>
#define INF 1000000000
#define DIM 355
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int D[DIM] , V[DIM] , C[DIM][DIM] , F[DIM][DIM] , T[DIM] , Z[DIM][DIM];
int n,m,d,s;
vector<int> L[DIM];
deque<int> q;
int bf(){
int nod,vecin,ok=0;
q.push_back(s);
for(int i=1;i<=n;i++){
D[i] = INF;
}
V[s]=1;
D[s]=0;
while ( ! q.empty() ){
nod = q.front();
for(int i = 0 ; i < L[nod].size() ; i++ ){
vecin = L[nod][i];
if( D[vecin] > D[nod] + Z[nod][vecin] && C[nod][vecin] > F[nod][vecin] ){
D[vecin] = D[nod] + Z[nod][vecin];
T[vecin] = nod;
if( V[vecin] == 0 ){
V[vecin] = 1;
q.push_back(vecin);
if( vecin == d ) ok=1;
}
}
}
V[nod]=0;
q.pop_front();
}
return ok;
}
int x,y,c,z,minim;
int main(){
fin>>n>>m>>s>>d;
for(int i=1;i<=m;i++){
fin>>x>>y>>c>>z;
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=c;
Z[x][y]=z;
Z[y][x]=-z;
}
int flux=0,cost=0;
while ( bf() == 1 ){
minim = INF ;
for( int i = d ; i != s ; i=T[i] ){
minim=min( minim , C[ T[i] ][i] - F[ T[i] ][i] );
}
flux+=minim;
for( int i = d ; i != s ; i=T[i] ){
F[ T[i] ][i] += minim;
F[i][ T[i] ] -= minim;
cost += minim * Z[ T[i] ][i];
}
}
fout<<cost<<"\n";
return 0;
}