Pagini recente » Cod sursa (job #644179) | Borderou de evaluare (job #2078319) | Cod sursa (job #2518395) | Cod sursa (job #731404) | Cod sursa (job #2085210)
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
FILE *f = fopen("fmcm.in","r");
FILE *g = fopen("fmcm.out","w");
int C[405][405];
int F[405][405];
int Cst[405][405];
int oldD[405];
int realD[405];
int dist[405];
int FF,Fst,S,D;
int N,M;
int T[405];
bool inQ[405];
queue<int> Q;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > H;
vector<int> G[405];
bool bellmandford(int S,int D){
for(int i = 1;i <= N;i++){
dist[i] = 1 << 28;
T[i] = 0;
}
dist[S] = 0;
inQ[S] = 1;
Q.push(S);
while(!Q.empty()){
int nod = Q.front();
inQ[nod] = 0;
Q.pop();
for(auto it:G[nod]){
if(F[nod][it] < C[nod][it] && dist[it] > dist[nod] + Cst[nod][it]){
dist[it] = dist[nod] + Cst[nod][it];
T[it] = nod;
if(!inQ[it]){
inQ[it] = 1;
Q.push(it);
}
}
}
}
return dist[D] != 1 << 28;
}
void maxflow(int S,int D)
{
while(bellmandford(S,D)){
int fmin = 1 << 30;
int cst = 0;
for(int nod = D;nod != S;nod = T[nod]){
fmin = min(fmin,C[T[nod]][nod] - F[T[nod]][nod]);
cst += Cst[T[nod]][nod];
}
FF += fmin;
Fst += fmin * cst;
for(int nod = D;nod != S;nod = T[nod]){
F[T[nod]][nod] += fmin;
F[nod][T[nod]] -= fmin;
}
}
}
int main()
{
fscanf(f,"%d %d %d %d",&N,&M,&S,&D);
for(int i = 1;i <= M;i++){
int x,y;
fscanf(f,"%d %d",&x,&y);
fscanf(f,"%d %d",&C[x][y],&Cst[x][y]);
Cst[y][x] = -Cst[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
maxflow(S,D);
fprintf(g,"%d",Fst);
fclose(f);
fclose(g);
return 0;
}