题意:有K头牛,有N个牧地,这N个牧地有M条单项路,求如果这K头牛(初始都在一个牧地上)要聚餐,可以去的地方有多少个,也就是每头牛都能到的地方有多少个?
思路:从每头牛所在位置进行dfs,找到能够到达的所有顶点。最后扫一遍顶点,看看哪个的数量等于牛数K即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
using namespace std;
#define INF 0x3fffffff
#define N 1005
struct edge{
int y,next;
}e[10005];
int num[N],flag[N],s[105],n,m,k,top,first[N];
void add(int x,int y){
e[top].y = y;
e[top].next = first[x];
first[x] = top++;
}
void dfs(int x){
int i;
flag[x] = 1;
num[x]++;
for(i = first[x];i!=-1;i=e[i].next)
if(!flag[e[i].y])
dfs(e[i].y);
}
int main(){
int i,a,b,res=0;
memset(first, -1, sizeof(first));
memset(num, 0, sizeof(num));
top = 0;
scanf("%d %d %d",&k,&n,&m);
for(i = 1;i<=k;i++)
scanf("%d",&s[i]);
for(i = 1;i<=m;i++){
scanf("%d %d",&a,&b);
add(a,b);
}
for(i = 1;i<=k;i++){
memset(flag, 0, sizeof(flag));
dfs(s[i]);
}
for(i = 1;i<=n;i++)
if(num[i]==k)
res++;
printf("%d\n",res);
return 0;
}