由于有多个源点和汇点,就考虑把所有源点变为从一个总源点来供应,所有汇点汇到一个总汇点,再写一个Edmonds-Karp即可。
#include"cstdio" #include"cctype" #include"cstring" #include"algorithm" using namespace std; int read() { int c,x=0; while(!isdigit(c=getchar())); while(x=x*10+c-‘0‘,isdigit(c=getchar())); return x; } int n,nc,np,m,s,t,vis[102],pre[102],f[102][102]; int bfs() { memset(vis,0,sizeof vis); memset(pre,0,sizeof pre); int q[102],l=0,r=0; vis[s]=1; q[r++]=s; while(l<r) { int fr=q[l++]; for(int i=0;i<=t;i++) if(!vis[i] && f[fr][i]) { q[r++]=i; vis[i]=1; pre[i]=fr; if(i==t) return 1; } } return 0; } int EK() { int res=0; while(bfs()) { int now=2e9; for(int i=t;i!=s;i=pre[i]) now=min(now,f[pre[i]][i]); for(int i=t;i!=s;i=pre[i]) { f[pre[i]][i]-=now; f[i][pre[i]]+=now; } res+=now; } return res; } int main() { while(~scanf("%d%d%d%d",&n,&np,&nc,&m)) { memset(f,0,sizeof f); s=n; t=n+1; for(int i=1;i<=m;i++) { int u=read(),v=read(),c=read(); f[u][v]=c; } for(int i=1;i<=np;i++) { int u=read(),p=read(); f[s][u]=p; } for(int i=1;i<=nc;i++) { int v=read(),c=read(); f[v][t]=c; } printf("%d\n",EK()); } return 0; }