|
#include <iostream>
using namespace std;
#define maxn 401
int g[maxn][maxn];//容量
int f[maxn][maxn];//流量
int r[maxn][maxn];//残量

int Edmonds_Karp(int g[][maxn],int s,int t,int f[][maxn])
  {
int i,j,k,c,head,tail,flow=0 ;
int prev[maxn],visit[maxn],q[maxn];
for(i=s;i<=t;i++)for(j=s;j<=t;j++)
 {
f[i][j]=0 ;
r[i][j]=g[i][j];
}
while(1)
 {
head=tail=0 ;
memset(visit,0,sizeof(visit));
q[tail++]=s ;
prev[s]=-1 ;
visit[s]=1 ;
while(head<tail)
 {
k=q[head++];
for(i=s;i<=t;i++) //注意修改
if(!visit[i]&&r[k][i]>0)
 {
visit[i]=1 ;
prev[i]=k ;
if(i==t)goto next ;
q[tail++]=i ;
}
}
next :
if(!visit[t])break ;
for(c=INT_MAX,j=t;j!=s;j=i)
 {
i=prev[j];
if(c>r[i][j])c=r[i][j];
}
for(j=t;j!=s;j=i)
 {
i=prev[j];
f[i][j]+=c ;
f[j][i]=-f[i][j];
r[i][j]=g[i][j]-f[i][j];
r[j][i]=g[j][i]-f[j][i];
}
flow+=c ;
}
return flow ;
}

int main()
  {
int i,j;
int s,t;
int F,N,D;
scanf("%d%d%d",&N,&F,&D);
s=0;
t=F+N+N+D+1;
for(i=1;i<=N;i++)
 {
int m,n,k;
scanf("%d%d",&m,&n);
for(j=1;j<=m;j++)//Food->Cow
 {
scanf("%d",&k);
g[k][i+F]=1;
}
for(j=1;j<=n;j++)//Cow->Drink
 {
scanf("%d",&k);
g[i+F+N][k+F+N+N]=1;
}
}
for(i=1;i<=F;i++)//Sourse->Food
g[s][i]=1;
for(i=1;i<=N;i++)//Cow->Cow
g[F+i][F+N+i]=1;
for(i=1;i<=D;i++)//Drink->Terminal
g[i+F+N+N][t]=1;
printf("%d\n",Edmonds_Karp(g,s,t,f));
return 0;
}

|