Pagini recente » Cod sursa (job #1818893) | Cod sursa (job #2504890) | Cod sursa (job #492813) | Cod sursa (job #672446) | Cod sursa (job #584930)
Cod sursa(job #584930)
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#include <algorithm>
#define NMax 400
#define INF 2000000000
using namespace std;
const char IN[]="fmcm.in",OUT[]="fmcm.out";
int N,M,S,D;
int T[NMax],P[NMax],C[NMax][NMax],F[NMax][NMax];
vector< pair<int,int> > ad[NMax];
bool inQue[NMax],done;
int BellmanFord(int s)
{
int x;
queue<int> qu;
qu.push(s);
for (int i=0;i<N;++i) T[i]=INF;
T[s]=0;
while (!qu.empty())
{
x=qu.front();
qu.pop();
inQue[x]=false;
for (vector<pair<int,int> >::iterator it=ad[x].begin();it<ad[x].end();++it)
if (C[x][it->first]>F[x][it->first] && T[x]+it->second<T[it->first])
{
T[it->first]=T[x]+it->second;
P[it->first]=x;
if (!inQue[it->first])
qu.push(it->first),
inQue[it->first]=true;
}
}
if (T[D]!=INF)
{
int Fmin=INF,i;
done=false;
for (i=D;i!=S;i=P[i])
Fmin=min(Fmin,C[P[i]][i]-F[P[i]][i]);
for (i=D;i!=S;i=P[i])
{
F[P[i]][i]+=Fmin;
F[i][P[i]]-=Fmin;
}
return Fmin*T[D];
}
return 0;
}
long long Flux()
{
long long ret=0;
while (!done)
{
done=true;
ret+=BellmanFord(S);
}
return ret;
}
int main()
{
int i,x,y,cost,cap;
freopen(IN,"r",stdin);
scanf("%d%d%d%d",&N,&M,&S,&D);--S;--D;
for (i=0;i<M;++i)
{
scanf("%d%d%d%d",&x,&y,&cap,&cost);
ad[x-1].push_back( make_pair(y-1,cost) );
ad[y-1].push_back( make_pair(x-1,-cost));
C[x-1][y-1]=cap;
}
fclose(stdin);
freopen(OUT,"w",stdout);
printf("%I64d\n",Flux());
fclose(stdout);
return 0;
}