从P3376的代码直接改过来的 只加了当前弧优化 目测是spfa出了问题
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100009;
const int inf=1e9;
int n,m,s,t;
int dis[N],flow[N],rad[N];
int ans1,ans2;
bool vis[N];
struct edge{
int to,c,d;
int nxt;
}e[N];
int hed[N],ecnt=1;
void add(int l,int r,int c,int d){
e[ecnt].to=r;
e[ecnt].c=c;
e[ecnt].d=d;
e[ecnt].nxt=hed[l];
hed[l]=ecnt;
ecnt++;
}
bool spfa(){
queue<int> q;
for(int i=1;i<=n;i++) dis[i]=inf;
for(int i=1;i<=n;i++) vis[i]=0;
q.push(s);
vis[s]=1;
dis[s]=0;
while(!q.empty()){
int cur=q.front();
q.pop();
vis[cur]=0;
for(int i=hed[cur];i;i=e[i].nxt){
if(e[i].c>0&&dis[e[i].to]>dis[cur]+e[i].d){
dis[e[i].to]=dis[cur]+e[i].d;
flow[e[i].to]=min(flow[cur],e[i].c);
if(!vis[e[i].to]){
q.push(e[i].to);
vis[e[i].to]=1;
}
}
}
}
return dis[t]<inf;
}
int dfs(int start,int flow){
int cnt=0;
if(start==t) return flow;
for(int i=rad[start];i&&flow;i=e[i].nxt){
rad[start]=i;
if(dis[e[i].to]==dis[start]+e[i].d&&e[i].c){
int ret=dfs(e[i].to,min(flow,e[i].c));
e[i].c-=ret;
e[i^1].c+=ret;
cnt+=ret;
flow-=ret;
ans2+=ret*e[i].d;
}
}
return cnt;
}
int main(){
// freopen("sj.txt","r",stdin);
cin>>n>>m>>s>>t;
for(int i=0;i<m;i++){
int u,v,w,c;
cin>>u>>v>>w>>c;
add(u,v,w,c);
add(v,u,0,-c);
}
int ans1=0,ans2=0;
while(spfa()) ans1+=dfs(s,inf);
cout<<ans1<<" "<<ans2<<endl;
return 0;
}