一个网络流的基础题吧,仿着书上做的,直接贴代码吧,比较简单
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#define MAX 110
using namespace std;
int n,np,nc,m,s,t;
int fa[MAX],q[MAX],f[MAX][MAX],c[MAX][MAX];
void proc()
{
int qs,qt,d,i,ans=0;
fa[t]=1;
while(fa[t]!=0)
{
qs=0;qt=1;
q[qt]=s;
memset(fa,0,sizeof(fa));
fa[s]=s;
while(qs<qt&&!fa[t])
{
i=q[++qs];
for(int j=1;j<=t;j++)
if(fa[j]==0)
if(f[i][j]<c[i][j])
{
fa[j]=i;
q[++qt]=j;
}
else if(f[j][i]>0)
{
fa[j]=-i;
q[++qt]=j;
}
}
if(fa[t]!=0)
{
d=1<<28;
i=t;
while(i!=s)
{
if(fa[i]>0)
d=min(d,c[fa[i]][i]-f[fa[i]][i]);
else
d=min(d,f[i][-fa[i]]);
i=abs(fa[i]);
}
ans+=d;
i=t;
while(i!=s)
{
if(fa[i]>0)
f[fa[i]][i]+=d;
else
f[i][-fa[i]]-=d;
i=abs(fa[i]);
}
}
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
{
s=n+2;
t=n+1;
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
int u,v,cc;
for(int i=1;i<=m;i++)
{
while(getchar()!='(');
scanf("%d,%d)%d",&u,&v,&cc);
c[u+1][v+1]=cc;
}
for(int i=1;i<=np;i++)
{
while(getchar()!='(');
scanf("%d)%d",&u,&cc);
c[s][u+1]=cc;
}
for(int i=1;i<=nc;i++)
{
while(getchar()!='(');
scanf("%d)%d",&u,&cc);
c[u+1][t]=cc;
}
proc();
}
return 0;
}