就DFS啊!没了!
其实就是把每个点枚举一遍,(如果已经枚举过就continue
)。
找个环,算出环内所有点的ans。
#include <bits/stdc++.h>
int t, n, p[200010], res[200010], a[200010], top, f[200010];
int dfs(int x) {
if (f[x]) return 0; f[x] = 1;
a[top++] = x;
return dfs(p[x]) + 1;
}
int main() {
scanf("%d", &t);
while (t--) {
memset(f, 0, sizeof f);
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
for (int i = 1; i <= n; i++)
if (!f[i]) {
int t = dfs(i);
for (int j = 0; j < top; j++) res[a[j]] = t;
top = 0;
}
for (int i = 1;i <= n; i++) printf("%d ", res[i]);
puts("");
}
return 0;
}