dinic WA两个 求助

P3381 【模板】最小费用最大流

EK还是WA了8,9 ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> using namespace std; int n,m,a,b,c,d,s,t,ans,ansb,wt,w[5010],v[5010],dis[5010]; queue<int>q; struct stu { int nx,to,cup,cost; }h[100010]; struct pre { int x,y; }p[5010]; int bfs() { for(int i=1;i<=n;i++) p[i].x=0,p[i].y=0,v[i]=0,dis[i]=99999999; q.push(s);v[s]=1;dis[s]=0; while(q.size()) { int xx=q.front();q.pop();v[xx]=0; for(int i=w[xx];i;i=h[i].nx) { int yy=h[i].to; if(h[i].cup&&dis[yy]>dis[xx]+h[i].cost) { dis[yy]=dis[xx]+h[i].cost;p[yy].x=xx;p[yy].y=i; if(v[yy]==0) q.push(yy),v[yy]=1; } } } cout<<dis[t]<<endl; return dis[t]; } void ek() { while(bfs()!=99999999) { int minn=99999999; for(int i=t;i!=s;i=p[i].x) minn=min(minn,h[p[i].y].cup); for(int i=t;i!=s;i=p[i].x) h[p[i].y].cup-=minn,h[p[i].y+1].cup+=minn; ans+=minn; ansb+=minn*dis[t]; } } int main() { cin>>n>>m>>s>>t; for(int i=1;i<=m;i++) { cin>>a>>b>>c>>d; wt++;h[wt].nx=w[a];h[wt].cup=c;h[wt].cost=d;h[wt].to=b;w[a]=wt; wt++;h[wt].nx=w[b];h[wt].cup=0;h[wt].cost=-d;h[wt].to=a;w[b]=wt; } ek(); cout<<ans<<" "<<ansb; return 0; }```
by jiangdi123 @ 2020-01-26 19:23:48


|