噢莫加纳加加加 • 4天前
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> T(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> T[i];
}
vector<int> dfn(n + 1, 0); // 时间戳
int timer = 1;
int ans = INT_MAX;
for (int i = 1; i <= n; i++) {
if (dfn[i] == 0) {
int start_time = timer;
int cur = i;
while (true) {
if (dfn[cur] != 0) {
// 如果当前节点已经访问过
if (dfn[cur] >= start_time) {
// 在当前DFS中访问过,形成环
int cycle_length = timer - dfn[cur];
if (cycle_length < ans) {
ans = cycle_length;
}
}
break;
}
dfn[cur] = timer++;
cur = T[cur];
}
}
}
cout << ans;
return 0;
}
评论:
请先登录,才能进行评论