从k个奶牛分别dfs,用mi[i]表示第i个牧场被遍历过多少次,最后只有mi[i]==k的牧场满足条件。
无权的有向图也可以用vector存储。
详细注释:
上ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
const int N=1e3+10;
int n,m,k,a[N],mi[N];
vector<int>v[N];
bool vis[N];
void dfs(int u){
mi[u]++;
for(auto x:v[u]){
if(!vis[x]){
vis[x]=true;
dfs(x);
vis[x]=true;
}
}
}
void solve(){
cin>>k>>n>>m;
for(int i=1;i<=k;i++){//先存储起来,方便后面使用
cin>>a[i];
}
for(int i=1;i<=m;i++){//建图
int u,vv;
cin>>u>>vv;
v[u].push_back(vv);
}
for(int i=1;i<=k;i++){//让每一头牛都跑一边图
//把他能到达的点的标记上(++)
//最后那个点的被经过的次数刚好是k(牛的个数),就代表这个点所用牛
//都可以到达
for(int j=1;j<=n;j++) vis[j]=false;//初始化,因为每一头牛跑dfs图都是独立的
vis[a[i]]=true;
dfs(a[i]);
}
int ans =0;
for(int i=1;i<=n;i++){
//最后那个点的被经过的次数刚好是k(牛的个数),就代表这个点所用牛
//都可以到达,即可行
if(mi[i]==k) ans++;
}
cout<<ans<<"\n";
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt=1;
//cin>>tt;
while(tt--){
solve();
}
return 0;
}
over~