Pagini recente » Cod sursa (job #1361252) | Cod sursa (job #2841943) | Cod sursa (job #2004479) | Cod sursa (job #284490) | Cod sursa (job #673574)
Cod sursa(job #673574)
#include <fstream>
#include <utility>
#include <cassert>
#include <queue>
using namespace std;
#define in "fmcm.in"
#define out "fmcm.out"
#define NMAX 360
#define f first
#define s second
#define mp make_pair
#define inf 10000000
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > h;
int C[NMAX][NMAX],F[NMAX][NMAX],G[NMAX][NMAX],Cost[NMAX][NMAX],T[NMAX],dist[NMAX];
int inQ[NMAX];
int N,M,S,D;
long long BF()
{
queue<int> Q;
int i;
for(i = 1; i <= N; i++)
{
dist[i] = inf;
inQ[i] = 0;
}
dist[S] = 0;
Q.push(S);
int nod;
while(!Q.empty())
{
nod = Q.front();
Q.pop();
inQ[nod] = 0;
for(i = 1; i <= G[nod][0]; i++)
if(dist[nod] + Cost[nod][G[nod][i]] < dist[G[nod][i]] && C[nod][G[nod][i]] - F[nod][G[nod][i]] > 0)
{
dist[G[nod][i]] = dist[nod] + Cost[nod][G[nod][i]];
T[G[nod][i]] = nod;
if(!inQ[G[nod][i]])
{
inQ[G[nod][i]] = 1;
Q.push(G[nod][i]);
}
}
}
int fmin = inf;
if(dist[D] != inf)
{
for(i = D; i != S; i = T[i])
fmin = min(C[T[i]][i] - F[T[i]][i],fmin);
for(i = D; i != S; i= T[i])
{
F[T[i]][i] += fmin;
F[i][T[i]] -= fmin;
}
return dist[D] * fmin;
}
return 0;
}
long long Flux()
{
long long ans = 0;
long long tans = 0;
do{
tans = BF();
ans += tans;
}while(tans);
return ans;
}
int main()
{
ifstream fin(in);
ofstream fout(out);
fin>>N>>M>>S>>D;
int i,x,y,cap,cst;
for(i = 1; i <= M; i++)
{
fin>>x>>y>>cap>>cst;
G[x][++G[x][0]] = y;
G[y][++G[y][0]] = x;
C[x][y] = cap;
C[y][x] = 0;
Cost[x][y] = cst;
Cost[y][x] = -cst;
}
fout<<Flux()<<'\n';
fin.close();
fout.close();
return 0;
}