最大流-多源多汇问题
建立超级源点,超级汇点
#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;
}