int n,m,s,t; int _=1,frm[M],to[M],nxt[M],val[M],cost[M]; void add_edge(int u,int v,int w,int c){ nxt[++_]=frm[u];frm[u]=_;to[_]=v;val[_]=w;cost[_]=c; nxt[++_]=frm[v];frm[v]=_;to[_]=u;val[_]=0;cost[_]=-c; } int d[N];bool vis[N]; int flow[N],pre[N]; inline bool spfa(){ queue<int> Q; memset(d,0x3f,sizeof(d)); memset(vis,0,sizeof(vis)); memset(pre,-1,sizeof(pre)); d[s]=0;flow[s]=inf;vis[s]=1; Q.push(s); while(Q.size()){ int u=Q.front();Q.pop();vis[u]=0; for(int i=frm[u];i;i=nxt[i]){ int v=to[i]; if(val[i]&&d[v]>d[u]+cost[i]){ d[v]=d[u]+cost[i]; flow[v]=min(flow[u],val[i]); pre[v]=i; if(!vis[v]){ vis[v]=1; Q.push(v); } } } } return d[t]!=inf; } signed main(){ cin>>n>>m>>s>>t; for(int i=1;i<=m;i++){ int u,v,w,c;cin>>u>>v>>w>>c; add_edge(u,v,w,c); } int maxflow=0,mincost=0; while(spfa()){ maxflow+=flow[t]; mincost+=flow[t]*d[t]; for(int i=t;i!=s;i=to[pre[i]^1]){ val[pre[i]]-=flow[t]; val[pre[i]^1]+=flow[t]; } } cout<<maxflow<<" "<<mincost<<endl; }
|