Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int tot=1,h[500000],n,m,s,t,flow[500000],up[500000],q[500000],dis[500000],pre[500000];
bool vis[500000];
struct edge{
int to,nxt,z,w;
}e[500000];
void add(int x,int y,int z,int w)
{
e[++tot].to=y;
e[tot].nxt=h[x];
e[tot].w=w;
e[tot].z=z;
h[x]=tot;
}
bool spfa(int x,int y)
{
memset(flow,127,sizeof(flow));
memset(vis,false,sizeof(vis));
memset(dis,127,sizeof(dis));
int head=0,tail=0;
q[++tail]=x;
dis[x]=0,pre[y]=-1,vis[x]=true;
while (head<tail)
{
head++;
int u=q[head];
vis[u]=false;
for (int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if (dis[v]>dis[u]+e[i].w&&e[i].z>0)
{
dis[v]=dis[u]+e[i].w,pre[v]=u,up[v]=i;
flow[v]=min(flow[u],e[i].z);
if (vis[v]==false)
vis[v]=true,q[++tail]=v;
}
}
}
if (pre[y]!=-1) return true;
return false;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=1;i<=m;i++)
{
int q,p,c,c1;
scanf("%d%d%d%d",&q,&p,&c,&c1);
add(q,p,c,c1),add(p,q,0,-c1);
}
int ansf=0,ansc=0;
while (spfa(s,t)==true)
{
int o=t;
ansf+=flow[t];
ansc+=flow[t]*dis[t];
while (o!=s)
{
e[up[o]].z-=flow[t];
e[up[o]^1].z+=flow[t];
o=pre[o];
}
}
printf("%d %d
",ansf,ansc);
}