#include<bits/stdc++.h>
#define N (int)(1e3+1e1)
using namespace std;
int k,n,m,u,v,cnt;
bool vis[N],vst[N];
vector<int> vt[N];
int dfs(int x){
int ctr=0;
vst[x]=true;
if(vis[x]) ctr=1;
for(int i=0;i<vt[x].size();i++){
if(!vst[vt[x][i]]) ctr+=dfs(vt[x][i]);
}
return ctr;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>k>>n>>m;
for(int i=1;i<=k;i++){
cin>>u;
vis[u]=true;
}
for(int i=1;i<=m;i++){
cin>>u>>v;
vt[v].push_back(u);//反图
}
for(int i=1;i<=n;i++){
memset(vst,false,sizeof(vst));
if(dfs(i)==k) cnt++;
}
cout<<cnt<<endl;
return 0;
}
评测记录:
AC AC AC AC WA
AC WA WA AC WA
思路:vis标记牧场有没有牛,vst作为dfs的访问标记。"如果一个奶牛能到达一个牧场,那么在反图中牧场就能到达奶牛",换言之“所有奶牛能到达一个牧场,在反图中牧场就能到达所有奶牛”。