Pagini recente » Cod sursa (job #2851452) | Cod sursa (job #1430249) | Cod sursa (job #377482) | Cod sursa (job #1320525) | Cod sursa (job #2085436)
#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];
void bellmanford(int S,int D){
for(int i = 1;i <= N;i++){
oldd[i] = 1 << 28;
}
oldd[S] = 0;
inQ[S] = 1;
Q.push(S);
while(!Q.empty()){
int nod = Q.front();
Q.pop();
for(auto it:G[nod]){
if(F[nod][it] < C[nod][it] && oldd[it] > oldd[nod] + Cst[nod][it]){
oldd[it] = oldd[nod] + Cst[nod][it];
if(!inQ[it]){
inQ[it] = 1;
Q.push(it);
}
}
}
}
}
bool dijkstra(int S,int D){
for(int i = 1;i <= N;i++){
dist[i] = 1 << 28;
T[i] = 0;
}
dist[S] = 0;
H.push({0,S});
while(!H.empty()){
int nod = H.top().second;
int cst = H.top().first;
H.pop();
if(cst != dist[nod]){
continue;
}
for(auto it:G[nod]){
if(F[nod][it] < C[nod][it]){
int newd = dist[nod] + oldd[nod] + Cst[nod][it] - oldd[it];
if(newd < dist[it]){
dist[it] = newd;
T[it] = nod;
reald[it] = Cst[nod][it] + reald[nod];
H.push({dist[it],it});
}
}
}
}
if(dist[D] == 1 << 28){
return 0;
}
memcpy(oldd,reald,sizeof(reald));
int fmin = 1 << 30;
for(int nod = D;nod != S;nod = T[nod]){
fmin = min(fmin,C[T[nod]][nod] - F[T[nod]][nod]);
}
FF += fmin;
Fst += reald[D] * fmin;
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);
}
bellmanford(S,D);
while(dijkstra(S,D));
fprintf(g,"%d",Fst);
fclose(f);
fclose(g);
return 0;
}