60求调
查看原帖
60求调
1338385
ffr25楼主2024/8/20 10:21

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;
}
2024/8/20 10:21
加载中...