WA的点为2 8 9 10,都是read 0。
int k, n, m, tem1, tem2, mc[1005], al[1005], ans = 0, vis[1005], h[101];//al记录牧场被访问次数
inline int read() {
char ch = getchar();
int x = 0, f = 1;
while (!isdigit(ch)) { if (ch == '-')f = -1; ch = getchar(); }
while (isdigit(ch))x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
struct node {
int a, b, n;
}vs[10010];
void dfs(int x,int num) {
if (vis[x])return;
al[x] += num; //第一次到达后访问次数+奶牛数
vis[x] = 1;
for (int i = h[x]; i; i = vs[i].n) {
dfs(vs[i].b, num);
}
return;
}
int main() {
k = read(), n = read(), m = read();
for (int i = 1; i <= k; i++) {
mc[read()]++; //mc[i]:i牧场有几头奶牛
}
for (int i = 1; i <= m; i++) {
tem1 = read(), tem2 = read();
vs[i].a = tem1, vs[i].b = tem2, vs[i].n = h[tem1]; //链式前向星
h[tem1] = i;
}
for (int i = 1; i <= n; i++) {
if (mc[i] != 0) {
fill(vis, vis + n + 1, 0); //重置vis数组
dfs(i, mc[i]); //从i牧场遍历所有它能到达的牧场
}
}
for (int i = 1; i <= n; i++) {
if (al[i] == k) { //如果牧场被访问次数与奶牛总数相当
ans++;
}
}
cout << ans;
return 0;
}