rt
#include<bits/stdc++.h>
using namespace std;
struct node {
long long v,w;
bool operator<(const node &t)const {
return t.w<w;
}
};
priority_queue<node> q;
long long e[5005]= {};
long long w[100005]= {};
long long v[100005]= {};
long long ct[100005]= {};
long long nx[100005]= {};
long long h[5005]={};
long long top[5005]={};
long long aa=0;
long long dis[5005]={};
bool f[5005]={};
long long idx=2;
void add(long long a,long long b,long long c,long long d) {
nx[idx]=e[a];
e[a]=idx;
w[idx]=c;
v[idx]=b;
ct[idx]=d;
idx++;
}
long long n,m,s,t;
long long dij() {
for(long long i=1;i<=n;i++)h[i]+=dis[i];
for(long long i=1;i<=n;i++)dis[i]=1e9;
for(long long i=1;i<=n;i++)f[i]=0;
q.push({s,0});
dis[s]=0;
while(!q.empty()){
node k=q.top();
q.pop();
if(f[k.v]!=0)continue;
f[k.v]=1;
for(long long i=e[k.v];i!=0;i=nx[i]){
if(w[i]>0&&f[v[i]]==0&&dis[v[i]]>dis[k.v]+ct[i]+h[k.v]-h[v[i]]){
dis[v[i]]=dis[k.v]+ct[i]+h[k.v]-h[v[i]];
q.push({v[i],dis[v[i]]});
}
}
}
for(long long i=1;i<=n;i++){
top[i]=e[i];
}
return dis[t];
}
long long dfs(long long u,long long f){
long long ans=0;
if(u==t||f==0)return f;
for(long long &i=top[u];i!=0;i=nx[i]){
if(dis[v[i]]!=dis[u]+ct[i]+h[u]-h[v[i]])continue;
if(f>=w[i]){
long long x=dfs(v[i],w[i]);
aa+=ct[i]*x;
w[i]-=x;
w[i^1]+=x;
f-=x;
ans+=x;
}else{
long long x=dfs(v[i],f);
aa+=ct[i]*x;
w[i]-=x;
w[i^1]+=x;
f-=x;
ans+=x;
}if(f==0)return ans;
}return ans;
}
int main() {
cin>>n>>m>>s>>t;
for(long long i=1; i<=m; i++) {
long long a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
add(a,b,c,d);
add(b,a,0,-d);
}
long long cnt=0;
while(dij()!=1000000000){
cnt+=dfs(s,1<<30);
}cout<<cnt<<" "<<aa;
return 0;
}
个人感觉可能是堆爆了(