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
| //n,m,s,t,分别代表该网络的点数n,网络的边数m,源点编号s,汇点编号t。 const int N=5010,M=100010,INF=1e8; int n,m,S,T; struct edge{int v,c,w,ne;}e[M]; int h[N],idx=1;//从2,3开始配对 int d[N],mf[N],pre[N],vis[N]; int flow,cost;
void add(int a,int b,int c,int d){ e[++idx]={b,c,d,h[a]}; h[a]=idx; } bool spfa(){ memset(d,0x3f,sizeof d); memset(mf,0,sizeof mf); queue<int> q; q.push(S); d[S]=0, mf[S]=INF, vis[S]=1; while(q.size()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=h[u];i;i=e[i].ne){ int v=e[i].v,c=e[i].c,w=e[i].w; if(d[v]>d[u]+w && c){ d[v]=d[u]+w; //最短路 pre[v]=i; mf[v]=min(mf[u],c); if(!vis[v]){ q.push(v); vis[v]=1; } } } } return mf[T]>0; } void EK(){ while(spfa()){ for(int v=T;v!=S;){ int i=pre[v]; e[i].c-=mf[T]; e[i^1].c+=mf[T]; v=e[i^1].v; } flow+=mf[T]; //累加可行流 cost+=mf[T]*d[T];//累加费用 } } int main(){ scanf("%d%d%d%d",&n,&m,&S,&T); int a,b,c,d; while(m --){ scanf("%d%d%d%d",&a,&b,&c,&d); //起点,终点,流量限制,单位流量费用。 add(a,b,c,d); add(b,a,0,-d); } EK(); printf("%d %d\n",flow,cost); return 0; }
|