样例全过 交上去 20 分
查看原帖
样例全过 交上去 20 分
448887
cancan123456楼主2024/9/9 10:44
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 3005;
vector < int > G[N], H[N], tree[N];
bool b[N][N], c[N][N];
// c[u][v] 删除 fa[u] 后从 v 是否能到达 u.
// b[u][v] 删除 u 后从 1 是否能到达 v.
int cnt[N], fa[N], sz[N];
void dfs(int u) {
	sz[u] = 1;
	for (int v : H[u]) {
		dfs(v);
		sz[u] += sz[v];
	}
}
int max(int a, int b) {
	return a > b ? a : b;
}
int main() {
//	freopen("in.txt", "r", stdin);
	int n, m, q;
	scanf("%d %d %d", &n, &m, &q);
	for (int u, v; m != 0; m--) {
		scanf("%d %d", &u, &v);
		G[u].push_back(v);
	}
	for (int del = 2; del <= n; del++) {
		queue < int > q;
		q.push(1);
		while (!q.empty()) {
			int u = q.front();
			b[del][u] = true;
			q.pop();
			for (int v : G[u]) {
				if (v != del && !b[del][v]) {
					q.push(v);
				}
			}
		}
		for (int u = 1; u <= n; u++) {
			if (!b[del][u]) {
				cnt[u]++;
			}
		}
	}
	for (int u = 2; u <= n; u++) {
		for (int f = 1; f <= n; f++) {
			if (!b[f][u]) {
				if (cnt[f] == cnt[u] - 1) {
					fa[u] = f;
				}
			}
		}
		H[fa[u]].push_back(u);
	}
	dfs(1);
	for (int u = 1; u <= n; u++) {
		H[u].clear();
	}
	for (int u = 1; u <= n; u++) {
		for (int v : G[u]) {
			H[v].push_back(u);
		}
	}
	for (int x = 2; x <= n; x++) {
		queue < int > q;
		q.push(x);
		while (!q.empty()) {
			int u = q.front();
			c[x][u] = true;
			q.pop();
			for (int v : H[u]) {
				if (v != fa[x] && !c[x][u]) {
					q.push(v);
				}
			}
		}
	}
	for (int u, v; q != 0; q--) {
		scanf("%d %d", &u, &v);
		int ans = 0;
		for (int x = 2; x <= n; x++) {
			if (b[fa[x]][u] && c[x][v]) {
				ans = max(ans, sz[x]);
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
2024/9/9 10:44
加载中...