Pagini recente » Cod sursa (job #694860) | Cod sursa (job #395145) | Cod sursa (job #3247024) | Cod sursa (job #1656110) | Cod sursa (job #2085443)
#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 d[405];
int FF,Fst,S,D;
int N,M;
int T[405];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > H;
vector<int> G[405];
bool dijkstra(int S,int D){
for(int i = 1;i <= N;i++){
realD[i] = 0;
d[i] = 1 << 28;
}
realD[S] = d[S] = 0;
H.push({0,S});
while(!H.empty()){
int cst = H.top().first;
int nod = H.top().second;
H.pop();
if(cst != d[nod]){
continue;
}
for(auto it:G[nod]){
if(C[nod][it] > F[nod][it]){
int newd = d[nod] + Cst[nod][it] + oldD[nod] - oldD[it];
if(newd < d[it]){
d[it] = newd;
H.push({d[it],it});
T[it] = nod;
realD[it] = realD[nod] + Cst[nod][it];
}
}
}
}
if(d[D] == 1 << 28){
return 0;
}
memcpy(oldD,realD,sizeof(realD));
int fmin = 1 << 30;
for(int i = D;i != S;i = T[i]){
fmin = min(fmin,C[T[i]][i] - F[T[i]][i]);
}
FF += fmin;
Fst += fmin * realD[D];
for(int i = D;i != S;i = T[i]){
F[T[i]][i] += fmin;
F[i][T[i]] -= fmin;
}
return 1;
}
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);
}
while(dijkstra(S,D));
fprintf(g,"%d",Fst);
fclose(f);
fclose(g);
return 0;
}