您的建边错了
应该是S->P->P->T
两次人,中间联为1的边
建图如下
···cpp
```cpp
main()
{
int q,p,room[N][N],dish[N][N];
scanf("%d%d%d",&n,&p,&q);
memset(e,-1,sizeof e);
memset(st,-1,sizeof st);
for (int i=1;i<=n;i++)
for (int j=1;j<=p;j++)
scanf("%d",&room[i][j]);
for (int i=1;i<=n;i++)
for (int j=1;j<=q;j++)
scanf("%d",&dish[i][j]);
int S=0,T=2*n+p+q;
for (int i=1;i<=p;i++)
add_edge(S,i,1); //S to room
for (int i=1;i<=n;i++)
add_edge(p+i,p+i+n,1); //people1 to people2
for (int i=1;i<=n;i++)
for (int j=1;j<=p;j++)
if (room[i][j])
add_edge(j,p+i,1); //room to people1
for (int i=1;i<=n;i++)
for (int j=1;j<=q;j++)
if (dish[i][j])
add_edge(p+n+i,p+2*n+j,1); //people2 to dish
for (int i=1;i<=q;i++)
add_edge(p+2*n+i,T,1); //dish to T
printf("%d\n",Dinic(S,T));
}
···
```
by 远航之曲 @ 2017-02-19 18:16:53