Pagini recente » Cod sursa (job #852039) | Cod sursa (job #100401) | Cod sursa (job #2663864) | Istoria paginii runda/pregatireoji_clasa_xi-xii/clasament | Cod sursa (job #1699313)
#include <bits/stdc++.h>
#define DIM 355
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int N,M,S,D,x,y,c,z;
int Flux;
int C[DIM][DIM],F[DIM][DIM],Z[DIM][DIM];
int Dist[DIM],T[DIM];
queue <int> Q;
vector <int> L[DIM];
bitset <DIM> viz;
int BF(){
viz.reset();
memset(Dist,0x3f3f3f3f,sizeof(Dist));
Q.push(S);
viz[S]=1;
Dist[S]=0;
while(!Q.empty()){
int node = Q.front();
viz[node]=0;
Q.pop();
for(int i=0;i<L[node].size();i++){
int vec = L[node][i];
if(F[node][vec] < C[node][vec] && Dist[vec] > Dist[node] + Z[node][vec]){
Dist[vec] = Dist[node] + Z[node][vec];
T[vec] = node;
if(!viz[vec]){
Q.push(vec);
viz[vec]=1;
}
}
}
}
return Dist[D] != 0x3f3f3f3f;
}
int main(){
fin >> N >> M >> S >> D;
for(int i=1;i<=M;i++){
fin >> x >> y >> c >> z;
L[x].push_back(y);
C[x][y]=c;
Z[x][y]=z;
Z[y][x]=-z;
}
while(BF()){
int node = D;
int minim = 0x3f3f3f3f;
while(T[node]!=0){
minim = min(minim,C[T[node]][node] - F[T[node]][node]);
node = T[node];
}
node = D;
while(T[node]!=0){
F[T[node]][node] += minim;
F[node][T[node]] -= minim;
Flux += Z[T[node]][node] * minim;
node = T[node];
}
}
fout << Flux << "\n";
}