A

噢莫加纳加加加  •  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;
}

评论:

请先登录,才能进行评论