POJ 1459 Power Network
有多个发电站 中转站 和用户 多源 多汇的最大流问题
建立源点 和 汇点 将发电站连到源点上将用户连到汇点上 求图的最大流
#include<iostream> #include<queue> #include<stdio.h> #include<cstring> using namespace std; #define INF 0x7fffffff int cap[503][503],a[503],p[503]; int ek(int s,int t,int n) { int f=0; while(1) { queue<int> q; memset(a,0,sizeof(a)); a[s]=INF; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(int v=0;v<=n;v++) if(!a[v]&&cap[u][v]) { p[v]=u; q.push(v); a[v]=a[u]<cap[u][v]?a[u]:cap[u][v]; } } if(a[t]==0) break; for(int u=t;u!=s;u=p[u]) { cap[p[u]][u]-=a[t]; cap[u][p[u]]+=a[t]; } f+=a[t]; } return f; } int main() { int n,np,nc,m; while(cin>>n) { int u,v,z; char str[11]; cin>>np>>nc>>m; memset(cap,0,sizeof(cap)); for(int i=1;i<=m;i++) { scanf("%s",str); sscanf(str,"(%d,%d)%d",&u,&v,&z); cap[u][v]=z; } for(int i=1;i<=np;i++) { scanf("%s",str); sscanf(str,"(%d)%d",&u,&z); cap[n][u]=z; } for(int i=1;i<=nc;i++) { scanf("%s",str); sscanf(str,"(%d)%d",&u,&z); cap[u][n+1]=z; } int s=n,t=n+1; cout<<ek(s,t,n+1)<<endl; } return 0; }