解题
2025-11-22 10:27:49
发布于:浙江
1阅读
0回复
0点赞
#include<cstdio>
#include<cstring>
using namespace std;
int n, a, to[1000001], ru[1000001], ans;
bool in[1000001], in2[1000001];
void dfs(int now) {
in[now] = 1;
ru[to[now]]--;
if (!ru[to[now]]) dfs(to[now]);
}
int dfs1(int now) {
if (in2[now]) return 0;
in2[now] = 1;
return 1 + dfs1(to[now]);
}
int main() {
// freopen("shuffle.in", "r", stdin);
// freopen("shuffle.out", "w", stdout);
scanf("%d", &n);//读入
for (int i = 1; i <= n; i++) {
scanf("%d", &a);//读入
to[i] = a;//连边
ru[a]++;//记录入读数
}
for (int i = 1; i <= n; i++)
if (!ru[i] && !in[i]) dfs(i);//找出不在环内的点
for (int i = 1; i <= n; i++)
if (!in2[i] && !in[i]) ans += dfs1(i);//统计在环中的点的数量
printf("%d", ans);//输出
// fclose(stdin);
// fclose(stdout);
return 0;
}
这里空空如也







有帮助,赞一个