随手一打就是吃什么
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=5010;
const int M=50010;
const int inf=0x3f3f3f3f;
int n,m,s,t;
struct node{
int to,nxt,val,c;
}e[M<<1];int head[N],cnt;
queue<int>q;
bool vis[N];
int dis[N];
int ans;
void add(int f,int t,int v,int c){
e[cnt]=(node){t,head[f],v,c};
head[f]=cnt++;
}
bool spfa(){
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof(dis));
dis[t]=0;
vis[t]=1;
q.push(t);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(e[i^1].val&&dis[v]>dis[u]-e[i].c){
dis[v]=dis[u]-e[i].c;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
return dis[s]<inf;
}
int dfs(int u,int mf){
vis[u]=1;
if(u==t) return mf;
int ret=0;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(!vis[v]&&e[i].val&&dis[u]==dis[v]+e[i].c){
int tmp=dfs(v,min(mf,e[i].val));
if(tmp) ans+=tmp*e[i].c;
e[i].val-=tmp;
e[i^1].val+=tmp;
ret+=tmp;
mf-=tmp;
if(!mf) return ret;
}
}
return ret;
}
int mincostflow(){
int f=0;
while(spfa()){
vis[t]=1;
while(vis[t]){
memset(vis,0,sizeof(vis));
f+=dfs(s,inf);
}
}
return f;
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
scanf("%d%d",&s,&t);
int x,y,v,c;
for(int i=1;i<=m;++i){
scanf("%d%d%d%d",&x,&y,&v,&c);
add(x,y,v,c);
add(y,x,0,-c);
}
cout<<mincostflow()<<" ";cout<<ans;
return 0;
}