记得把数组开大一点,不然就RE了。。。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5;
const int M=5e5;
const int INF=0x3f3f3f3f;
int n,m,s,t,ans,d[N],maxflow;
int tot=1,adj[N],nex[M],to[M],cap[M],cost[M];
bool walk[N],vis[N];
void add(int u,int v,int w,int c){
nex[++tot]=adj[u];
adj[u]=tot;
to[tot]=v;
cap[tot]=w;
cost[tot]=c;
}
bool SPFA(){
queue<int> q;
for(int i=1;i<=n;i++)
vis[i]=false,walk[i]=false,d[i]=INF;
q.push(s),d[s]=0,vis[s]=true;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=false;
for(int i=adj[u];i;i=nex[i]){
int v=to[i];
if(cap[i]>0&&d[u]+cost[i]<d[v]){
d[v]=d[u]+cost[i];
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
return d[t]<INF;
}
int dinic(int u,int fw){
if(u==t){
ans+=fw*d[t];
return fw;
}
walk[u]=true;
int rest=fw;
for(int i=adj[u];i&&rest;i=nex[i]){
int v=to[i];
if(!walk[v]&&cap[i]>0&&d[u]+cost[i]==d[v]){
int k=dinic(v,min(cap[i],rest));
if(k){
cap[i]-=k;cap[i^1]+=k;
rest-=k;
}
}
}
return fw-rest;
}
void solve(){
maxflow=ans=0;
while(SPFA()) maxflow+=dinic(s,INF);
}
signed main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w,c;
cin>>u>>v>>w>>c;
add(u,v,w,c);
add(v,u,0,-c);
}
solve();
cout<<maxflow<<" "<<ans;
return 0;
}