Pagini recente » Cod sursa (job #2180765) | Cod sursa (job #2245566) | Cod sursa (job #1575921) | Cod sursa (job #2445126) | Cod sursa (job #1699306)
#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();
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 viz[D]!=0;
}
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;
C[y][x]=-c;
Z[x][y]=Z[y][x]=z;
}
while(BF()){
int node = D;
int minim = 0x3f3f3f3f;
while(node!=S){
minim = min(minim,C[T[node]][node] - F[T[node]][node]);
node = T[node];
}
node = D;
while(node!=S){
F[T[node]][node] += minim;
F[node][T[node]] -= minim;
Flux += Z[T[node]][node] * minim;
node = T[node];
}
}
fout << Flux << "\n";
}