#include <bits/stdc++.h>
using namespace std;
const int N = 2100, M = 11000;
int n, m, k[N], vis[N], a, b, now;
vector<int> e[M], v[M], vt[N];
inline int dfs(int u) {
if (vis[u]) return k[u];
vis[u] = 1;
for (int v : e[u]) k[u] = min(k[u], dfs(v) - 1);
vt[k[u]].push_back(u);
return k[u];
}
inline void rdfs(int u) {
vis[u] = 1;
for (int to : v[u]) if (!vis[to]) rdfs(to);
}
signed main () {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &k[i]);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
e[a].push_back(b), v[b].push_back(a);
}
for (int i = 1; i <= n; i++) if (!vis[i]) dfs(i);
for (int i = 1; i <= n; i++) for (int v : vt[i]) printf("%d ", v);
printf("\n");
for (int i = 1, now = n; i <= n; i++, now = n) {
memset(vis, 0, sizeof(vis));
rdfs(i);
for (int j = n; j >= 1; j--) {
if (now > j) break;
for (int v : vt[j]) if (!vis[v]) now--;
}
printf("%d ", now);
}
return 0;
}
输入 a,b 组成的图应该是 DAG 吧,那如果去掉 dfs 和 rdfs 中的 vis 判断就会死循环呢?