Cod sursa(job #403509)
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define DIM 360
#define INF 1<<30
typedef pair <short int,short int> p;
short int C[DIM][DIM],F[DIM][DIM],T[DIM];
short int n,m,x,y,c,z;
short int START,END,nod;
int Flow,Rez;
vector <int> cost;
vector <bool> ut;
vector <p> g[DIM];
vector <p> ::iterator it;
struct cmp
{
bool operator () (const short int &i,const short int &j) const
{
return cost[i]>cost[j];
}
};
priority_queue <short int,vector <short int>,cmp> Q;
bool dijkstra()
{
cost.clear();cost.resize(DIM,INF);
ut.clear();ut.resize(DIM,0);
for(cost[START]=0,Q.push(START);!Q.empty();)
{
int nod=Q.top();
Q.pop(); ut[nod]=0;
for(it=g[nod].begin();it!=g[nod].end();it++)
{
if(cost[it->first]<=cost[nod]+it->second)
continue;
if(C[nod][it->first]<=F[nod][it->first])
continue;
cost[it->first]=cost[nod]+it->second;
T[it->first]=nod;
if(ut[it->first])
continue;
ut[it->first]=1;
Q.push(it->first);
}
}
return cost[END]==INF?0:1;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%hd%hd%hd%hd",&n,&m,&START,&END);
for(int i=1;i<=m;i++)
{
scanf("%hd%hd%hd%hd",&x,&y,&c,&z);
C[x][y]=c;
g[x].push_back(p(y,z));
g[y].push_back(p(x,-z));
}
while(dijkstra())
{
Flow=INF;
for(nod=END;nod!=START;nod=T[nod])
Flow=min(Flow,C[T[nod]][nod]-F[T[nod]][nod]);
for(nod=END;nod!=START;nod=T[nod])
{
F[T[nod]][nod]+=Flow;
F[nod][T[nod]]-=Flow;
}
Rez+=cost[END]*Flow;
}
printf("%d\n",Rez);
return 0;
}