题目链接:http://poj.org/problem?id=3256
/* 对每个有牛的草地,都进行dfs,沿着所有的有向边,标记所有经过的草地,经过草地时,草地i的属性visited[i]++, 若存在草地的visited[i]==K,则说明所有的K只牛都能到达此地 cow[i]指的是第i只牛所在的草地 存储路径可以使用邻接表 */ #include<iostream> #include<queue> using namespace std; int k,n,m; int head[1001]; int x,y; int cow[101]; int result; int visit[1001]; int mark[1001]; //邻接表 struct node{ int u,v; int next; }edge[10001]; void dfs(int x){ //对第i个草地进行dfs visit[x]++; mark[x]=1; int cur=head[x]; while(cur!=-1) { if(mark[edge[cur].v]==0) dfs(edge[cur].v); cur=edge[cur].next; } } int main (){ while(cin>>k>>n>>m){ memset(visit,0,sizeof(visit)); for(int i=0;i<k;i++) cin>>cow[i]; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++) { cin>>x>>y; edge[i].u=x; edge[i].v=y; edge[i].next=head[x]; head[x]=i; } for(int i=0;i<k;i++) { memset(mark,0,sizeof(mark)); dfs(cow[i]); } result=0; for(int i=1;i<=n;i++) { if(visit[i]==k) result++; //cout<<visit[i]; } cout<<result<<endl; } return 0; }