Pagini recente » Cod sursa (job #2239054) | Cod sursa (job #1398953) | Cod sursa (job #327449) | Cod sursa (job #964735) | Cod sursa (job #1150330)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define Nmax 355
#define Mmax 12509
#define oo 2000000000
#define pb push_back
#define y first
#define c second
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int N,M,Source,Sink,x,y,c,z,MaxFlow,CostMin,used[Nmax];
int cap[Nmax][Nmax],cost[Nmax][Nmax],flow[Nmax][Nmax],ante[Nmax],d[Nmax];
vector < int > G[Nmax];
bitset < Nmax > inQ,viz;
queue < int > Q;
inline void ReadInput()
{
f>>N>>M>>Source>>Sink;
for(int i=1;i<=M;++i)
f>>x>>y>>c>>z , G[x].pb(y) , G[y].pb(x) ,
cap[x][y]=c , cap[y][x]=0,
cost[x][y]=z , cost[y][x]=-z;
}
int BF(int Source)
{
for(int i=1;i<=N;++i)d[i]=oo,ante[i]=oo,used[i]=0;
d[Source]=0 , ante[Source]=Source , inQ[Source]=1;
for(Q.push(Source); !Q.empty();Q.pop())
{
int node=Q.front();
inQ[node]=0; ++used[node];
if(used[node]==N)return 0;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();++it)
if(d[*it]>d[node]+cost[node][*it] && flow[node][*it]<cap[node][*it])
{
d[*it]=d[node]+cost[node][*it];
ante[*it]=node;
if(!inQ[*it])Q.push(*it) , inQ[*it]=1;
}
}
if(d[Sink]!=oo)
{
int MinFlow=oo;
for(int i=Sink; i!=Source ; i=ante[i])
MinFlow=min(MinFlow,cap[ante[i]][i]-flow[ante[i]][i]);
if(MinFlow)
{
for(int i=Sink; i!=Source ; i=ante[i])
{
flow[ante[i]][i]+=MinFlow;
flow[i][ante[i]]-=MinFlow;
}
return MinFlow;
}
}
return 0;
}
int main()
{
ReadInput();
for(int MinFlow=BF(Source); MinFlow ; MinFlow=BF(Source) )
CostMin+=MinFlow*d[Sink];
g<<CostMin<<'\n';
f.close();g.close();
return 0;
}