是参考cmd的代码写的
用spfa跑的EK
// Problem: P3381 【模板】最小费用最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3381
// Memory Limit: 128 MB
// Time Limit: 1000 ms
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
const int maxn = 5100;
const int inf = 2e9;
int n,m,s,t,head[maxn],cnt=1;
struct node {
int next,v,cap,w;
}edge[maxn<<1] ;
void add(int u,int v,int cap,int w) {
edge[++cnt]=(node) {head[u],v,cap,w} ;
head[u] = cnt ;
edge[++cnt]=(node) {head[v],u,0,-w } ;
head[v] = cnt ;
}
int pre[maxn],lp[maxn];
int dis[maxn],flow[maxn] ;
bool isins[maxn];
queue<int> q ;
int spfa() {
for(int i=0;i<=n;++i)
dis[i]=inf,flow[i]=0;
flow[s] = inf ;
dis[s] = 0 ;
q.push(s) ;isins[s] = 1 ;
while(!q.empty()) {
int u = q.front() ;
isins[u] = 0 ;q.pop() ;
for(int i = head[u],v;i;i=edge[i].next) {
if(edge[i].cap && dis[v = edge[i].v] > dis[u] + edge[i].w) {
dis[v] = dis[u] + edge[i].w ;
flow[v] = min (flow[u],edge[i].cap) ;
lp[v] = i ; pre[v] = u ;
if(!isins[v]) isins[v] = 1,q.push(v) ;
}
}
}
return flow[t] ;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
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) ;
}
int d,ans=0,cans=0;
while(d = spfa()) {
int u = t;
while(u!=s) {
int last = pre[u] ;
edge[lp[u]].cap -= d ;
edge[lp[u]^1].cap += d;
u = last;
}
ans += d;
cans += d * dis[t] ;
}
cout << ans << ' ' << cans << '\n' ;
return 0;
}