题目大意:
注释代码:
无注释代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define MAXK 100
#define MAXN 1000
#define MAXM 10000
using namespace std;
short pos[MAXK + 1];
short reach[MAXN + 1];
short head[MAXN + 1];
short to[MAXM + 1];
short nxt[MAXM + 1];
bool vis[MAXN + 1];
int e;
queue<short> que;
void
addarc( int u, int v ) {
to[e] = v;
nxt[e] = head[u];
head[u] = e++;
}
void
bfs(int s) {
int u, v;
int i;
memset(vis, 0, sizeof(vis));
vis[s] = true;
que.push(s);
while ( !que.empty() ) {
reach[ u = que.front() ]++;
que.pop();
for ( i = head[u]; i; i = nxt[i] )
if ( !vis[ v = to[i] ] ) {
vis[v] = true;
que.push(v);
}
}
}
int
main() {
int n, m, k;
int u, v;
int i;
int ans;
ans = 0;
e = 1;
scanf("%d%d%d", &k, &n, &m);
for ( i = 1; i <= k; i++ ) scanf("%d", pos + i);
while ( m-- ) {
scanf("%d%d", &u, &v);
addarc( u, v );
}
for ( i = 1; i <= k; i++ ) bfs( pos[i] );
for ( i = 1; i <= n; i++ )
if ( reach[i] == k )
ans++;
printf("%d\n", ans);
return 0;
}