社区讨论
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 条回复,欢迎继续交流。
正在加载回复...