社区讨论

25pts 求调

P13823「Diligent-OI R2 C」所谓伊人参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mhjd945g
此快照首次捕获于
2025/11/04 00:40
4 个月前
此快照最后确认于
2025/11/04 00:40
4 个月前
查看原帖
不知道哪里有问题,只有25分;
CPP
#include <bits/stdc++.h>
using namespace std;

const int N = 500010, M = 1000010;

int n, m, k;
int p[N];
int head[N], e[M], ne[M], idx, rhead[N];
int dis[N];
bool vis[N];
vector<int> v[N];
queue<int> q;

void add(int *h, int a, int b) {
	e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}

void dfs(int x) {
	vis[x] = 1, v[k].push_back(x);
	for (int i = head[x]; i; i = ne[i]) {
		int j = e[i];
		if (!vis[j]) dfs(j);
	}
	for (int i = rhead[x]; i; i = ne[i]) {
		int j = e[i];
		if (!vis[j]) dfs(j);
	}
}

void f(int x, int *h, int d) {
	for (int i = h[x]; i; i = ne[i]) {
		int j = e[i];
		if (dis[j] == -1) {
			dis[j] = d;
			q.push(j);
			f(j, h, d);
		}
	}
}

void bfs(int x) {
	int maxx = 0;
	for (int i : v[x]) maxx = max(maxx, p[i]);
	for (int i : v[x])
		if (p[i] == maxx) {
			dis[i] = 0;
			q.push(i);
		}
	while (q.size()) {
		int u = q.front();
		q.pop();
		f(u, head, dis[u] + 1);
		f(u, rhead, dis[u] + 1);
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
	while (m--) {
		int u, v;
		scanf("%d%d", &u, &v);
		if (u == v) continue;
		add(head, u, v), add(rhead, v, u);
	}
	for (int i = 1; i <= n; i++)
		if (!vis[i])
			k++, dfs(i);
	memset(dis, -1, sizeof dis);
	for (int i = 1; i <= k; i++) bfs(i);
	for (int i = 1; i <= n; i++) printf("%d ", dis[i]);
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...