EK+SPFA
#include<bits/stdc++.h>
using namespace std;
const int INF=0x7f7f7f7f;
//链式前向星
struct Edge{
int v,w,next,val;//val为价格
}e[100010];
int head[5010],tot=1;
void AddEdge(int u,int v,int w,int val){
tot++;
e[tot].v=v;
e[tot].w=w;
e[tot].val=val;
e[tot].next=head[u];
head[u]=tot;
return;
}
//map
int n,m,s,t;
int u,v,w,val;
//spfa
int vis[5010],dis[5010];//dis[i]为1至i的最短路
struct route{
int u,pre;
}node[5010];
//最大流
bool spfa(){
queue<int>Q;
for(int i=0;i<5010;i++)node[i].u=node[i].pre=0;
for(int i=0;i<5010;i++)vis[i]=0;
for(int i=0;i<5010;i++)dis[i]=INF;
Q.push(s);
vis[s]=1;
dis[s]=0;
while(!Q.empty()){
int p=Q.front();
Q.pop();
vis[p]=0;
for(int i=head[p];i;i=e[i].next){
int d=e[i].v;
if(e[i].w&&dis[d]>dis[p]+e[i].val){
dis[d]=dis[p]+e[i].val;
node[d].u=p;
node[d].pre=i;
if(!vis[d])vis[d]=1,Q.push(d);
}
}
}
return dis[t]!=INF;
}
int EK(){
int ansf=0,ansg=0;
while(spfa()){
int mn=INF;
for(int i=t;i!=s;i=node[i].u)mn=min(mn,e[node[i].pre].w);
for(int i=t;i!=s;i=node[i].u){
e[node[i].pre].w-=mn;
e[node[i].pre^1].w+=mn;
}
ansf+=mn;
ansg+=mn*dis[t];
}
printf("%d %d",ansf,ansg);
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&u,&v,&w,&val);
AddEdge(u,v,w,val);
AddEdge(v,u,0,-val);
}
EK();
return 0;
}
全TLE,但是测过数据点,23ms。