#include <iostream>
#include <string.h>
using namespace std;
struct edge {
int to;
int next;
} e[10005];
int cur=0;
int niu[101];//牛所处的牧场
int head[1001];
int vis[1001];//单次遍历用的数组
int pos[1001];//最后判断用的数组
int n,m,k,u,v;
int ans=0;
void dfs(int x) { //x为位置,num为到达地方总和数量
if(vis[x])
return ;
vis[x]=1;
for(int i=head[x]; i; i=e[i].next) {
dfs(e[i].to);
}
return ;
}
int main() {
cin>>k>>n>>m;
for(int x=1; x<=k; x++)
cin>>niu[x];
for(int x=1; x<=m; x++) {
cin>>u>>v;
cur++;
if(head[u]) {
e[head[u]].next=cur;
head[u]=cur;
e[cur].to=v;
} else {
e[cur].to=v;
head[u]=cur;
}
}
memset(pos,1,sizeof(pos));
for(int x=1; x<=k; x++) {
dfs(niu[x]);
for(int y=1; y<=n; y++) {
if(!vis[y])
pos[y]=0;
}
memset(vis,0,sizeof(vis));
}
for(int x=1; x<=n; x++) {
if(pos[x])
ans++;
}
cout<<ans;
return 0;
}
用的是链式前向星存图,思路是对每个奶牛存在的牧场出发遍历判断抵达哪几个牧场,最后判断有哪些牧场能被所有奶牛到达。