Cod sursa(job #411278)
#include<fstream>
#include<queue>
#include<cstdlib>
#include<vector>
#define nx 355
#define mx 800000
#define inf 2000000000
using namespace std;
int cap[nx][nx],flux[nx][nx],drum;
int n,m,tat[nx],cost[nx][nx],d[nx],Q[mx],S,D,viz[nx];
vector <int> a[nx];
inline int min (int x,int y)
{ if (x<y) return x; return y; }
long bf ()
{
int i,r,j;
for (i=1;i<=n;++i) { d[i]=inf; tat[i]=-1; viz[i]=0; }
queue <int> Q;
Q.push(S); d[S]=0; viz[S]=1;
while (!Q.empty())
{
r=Q.front();
viz[r]=0;
for (i=0;i<a[r].size();++i)
if (cap[r][a[r][i]]>flux[r][a[r][i]] && d[a[r][i]]>d[r]+cost[r][a[r][i]])
{
d[a[r][i]]=d[r]+cost[r][a[r][i]];
tat[a[r][i]]=r;
if (!viz[a[r][i]])
{
viz[a[r][i]]=1;
Q.push(a[r][i]);
}
}
Q.pop();
}
if (d[D]!=inf)
{
r=inf;
drum=1;
for (i=D;i!=S;i=tat[i])
r=min(r,cap[tat[i]][i]-flux[tat[i]][i]);
for (i=D;i!=S;i=tat[i])
{
flux[tat[i]][i]+=r;
flux[i][tat[i]]-=r;
}
return d[D]*r;
}
return 0;
}
long fluxx ()
{
long rez=0;drum=1;
while (drum)
{
drum=0;
rez+=bf();
}
return rez;
}
int main()
{
ifstream be ("fmcm.in");
ofstream ki ("fmcm.out");
be>>n>>m>>S>>D;
int i,x,y,z,c;
for (i=1;i<=m;++i)
{
be>>x>>y>>z>>c;
cap[x][y]=z;
cost[x][y]=c;
cost[y][x]=-c;
a[x].push_back(y);
a[y].push_back(x);
}
be.close();
ki<<fluxx()<<'\n';
ki.close();
return 0;
}