POJ 1459 Power Network
最大流-多源多汇问题
建立超级源点,超级汇点
#include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; const int inf=0xfffffff; queue<int>q; int n,np,nc,m,s,t; int cap[105][105],flow[105][105],d[105],g[105][105]; int main() { int i,a,b,c,f,ss; char s1,s2,s3; while(cin>>n>>np>>nc>>m) { s=n;t=n+1; memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); memset(g,0,sizeof(g)); for(i=0;i<m;i++) { cin>>s1>>a>>s2>>b>>s3>>c; if(a==b) continue; cap[a][b]=c; g[a][++g[a][0]]=b; } for(i=0;i<np;i++) { cin>>s1>>a>>s2>>c; cap[s][a]=c; g[s][++g[s][0]]=a; } for(i=0;i<nc;i++) { cin>>s1>>a>>s2>>c; cap[a][t]=c; g[a][++g[a][0]]=t; } f=0; int p[105]; for(;;) { memset(d,0,sizeof(d)); d[s]=inf; q.push(s);ss=0; while(!q.empty()) { int u=q.front();q.pop(); for(int v=1;v<=g[u][0];v++) if(!d[g[u][v]] && cap[u][g[u][v]]>flow[u][g[u][v]]) { p[g[u][v]]=u;q.push(g[u][v]); int tt=cap[u][g[u][v]]-flow[u][g[u][v]]; d[g[u][v]]=d[u]<tt?d[u]:tt; if(g[u][v]==t) { ss=1;break; } } if(ss) break; } while(!q.empty()) q.pop(); if(d[t]==0) break; for(int u=t;u!=s;u=p[u]) { flow[p[u]][u]+=d[t]; flow[u][p[u]]-=d[t]; } f+=d[t]; } cout<<f<<endl; } return 0; }