1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include<bits/stdc++.h> #define maxn 50007 #define N 5007 #define inf 2139062143 using namespace std; int n,m,s,t,incf[N],head[N],cent=1,dis[N]; int vis[N],maxflow,mincost,pre[N]; struct node{ int next,to,w,cost; }edge[maxn<<3];
inline void add(int u,int v,int w,int c){ edge[++cent]=(node){head[u],v,w,c};head[u]=cent; edge[++cent]=(node){head[v],u,0,-c};head[v]=cent; }
bool spfa(){ queue<int >q; memset(pre,0,sizeof(pre)); memset(dis,127,sizeof dis); memset(vis,0,sizeof vis); q.push(s);dis[s]=0;vis[s]=1; incf[s]=1<<30; while(!q.empty()){ int x=q.front();q.pop(); vis[x]=0; for(int i=head[x],y;i;i=edge[i].next){ if(!edge[i].w) continue; if(dis[y=edge[i].to]>dis[x]+edge[i].cost){ dis[y]=dis[x]+edge[i].cost; incf[y]=min(incf[x],edge[i].w); pre[y]=i; if(!vis[y]) q.push(y),vis[y]=1; } } } if(dis[t]==2139062143) return 0; return 1; }
void update(){ int x=t; while(x!=s){ int i=pre[x]; edge[i].w-=incf[t]; edge[i^1].w+=incf[t]; x=edge[i^1].to; } maxflow+=incf[t]; mincost+=dis[t]*incf[t];
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1,a,b,c,d;i<=m;i++){ scanf("%d%d%d%d",&a,&b,&c,&d); add(a,b,c,d); } while(spfa()) update(); printf("%d %d",maxflow,mincost); }
|