最小费用最大流模板
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 2147483647
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
const int maxn=2e5+10;
int maxflow,cost;
int head[maxn],dis[maxn],cnt=1,inque[maxn];
int n,m,s,t;//s源点,t汇点
struct Edge{
int v,nxt;
int val;//流量
int w;//花费
}node[maxn];
struct Pre{
int fa;//前一个节点
int edge;//该点与前一个节点所连的边
}pre[maxn];
void add(int u,int v,int val,int w){
node[++cnt].v=v;
node[cnt].val=val;
node[cnt].w=w;
node[cnt].nxt=head[u];
head[u]=cnt;
}
bool spfa(){
memset(pre,-1,sizeof(pre));
memset(dis,0x3f,sizeof(dis));
CLR(inque);
queue<int> q;
inque[s]=1;
q.push(s);
dis[s]=0;
while(!q.empty()){
int u=q.front();
q.pop();
inque[u]=0;
for(int i=head[u];i;i=node[i].nxt){
int v=node[i].v;
int w=node[i].w;
if(node[i].val>0&&dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
pre[v].fa=u;
pre[v].edge=i;
if(!inque[v]){
inque[v]=1;
q.push(v);
}
}
}
}
return pre[t].fa!=-1;
}
int EK(){
maxflow=0;
cost=0;
int mi;
while(spfa()){
mi=INF;
for(int i=t;i!=s;i=pre[i].fa) mi=min(mi,node[pre[i].edge].val);
for(int i=t;i!=s;i=pre[i].fa){
node[pre[i].edge].val-=mi;
node[pre[i].edge^1].val+=mi;
}
maxflow+=mi;
cost+=mi*dis[t];
}
return maxflow;
}
int main() {
scanf("%d%d%d%d",&n,&m,&s,&t);
int u,v,val,w;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&u,&v,&val,&w);
add(u,v,val,w);
add(v,u,0,-w);
}
printf("%d ",EK());
printf("%d",cost);
return 0;
}
/*
4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
*/
/*
50 280
*/