Pagini recente » Cod sursa (job #748549) | Cod sursa (job #213741) | Cod sursa (job #1284262) | Cod sursa (job #1239192) | Cod sursa (job #1612533)
#include <fstream>
#include <iostream>
#include <queue>
#include <bitset>
#include <vector>
#define site vector <int>::iterator
#define DIM 355
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int N,M,S,D;
vector <int> L[DIM];
int F[DIM][DIM],C[DIM][DIM],T[DIM],Z[DIM][DIM];
int Flux ;
bitset <DIM> inQueue;
int d[DIM];
int BF(){
for(int i=1;i<=N;i++)
d[i]=INF;
d[S]=0;
inQueue.reset();
inQueue[S]=1;
queue <int> Q;
Q.push(S);
while(!Q.empty()){
int node = Q.front();
inQueue[node]=0;
Q.pop();
for(site it=L[node].begin();it!=L[node].end();it++)
if(C[node][*it] > F[node][*it] && d[*it] > d[node] + Z[node][*it]){
d[*it] = d[node] + Z[node][*it];
T[*it]=node;
if(!inQueue[*it]){
inQueue[*it]=1;
Q.push(*it);
}
}
}
return d[D]!=INF;
}
int main(){
fin >> N >> M >> S >> D;
while(M--){
int x,y,c,z;
fin >> x >> y >> c >> z;
L[x].push_back(y);
L[y].push_back(x);
Z[x][y]=z;
Z[y][x]=-z;
C[x][y] = c;
}
while(BF()){
int minim = INF;
int X = D;
while(T[X]!=0){
if(minim > C[T[X]][X] - F[T[X]][X])
minim = C[T[X]][X] - F[T[X]][X];
X=T[X];
}
X = D;
while(T[X]!=0){
F[T[X]][X] += minim;
F[X][T[X]] -= minim;
Flux += minim * Z[T[X]][X];
X=T[X];
}
}
fout << Flux << "\n";
}