开始用floyd可以,不过时间太慢了(N*N*N)
后来枚举牛做DFS连通性检验,O(N*M)

#include<stdio.h>
#include<string.h>
int net[1009][1009];
bool visit[1009];
int cow[109];
int c[1009];
void dfs(int x)
{
c[x]++;
visit[x]=1;
for(int i=1;i<=net[x][0];i++)
{
if(!visit[net[x][i]])
dfs(net[x][i]);
}
}
int main()
{
int k,n,m;
while(scanf("%d%d%d",&k,&n,&m)!=EOF){
int i,j;
for(i=1;i<=k;i++){
scanf("%d",&cow[i]);
}
for(i=0;i<=n;i++){
c[i]=0;
for(j=0;j<=n;j++){
net[i][j]=0;
}
}
for(i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
net[x][++net[x][0]]=y;
}
for(i=1;i<=k;i++){
memset(visit,0,sizeof(visit));
dfs(cow[i]);
}
int all=0;
for(i=1;i<=n;i++){
if(c[i]==k)
all++;
}
printf("%d\n",all);
}
}