LibreOJ 2421 信息传递

题目链接:LibreOJ 2421 信息传递

题目大意:

题解:
建立传递者和接收者的单向边,加边的同时判断是否成环,记录环的大小并更新最小值。

#include <iostream>
using namespace std;

int n, fa[200010], ans = 0x3f3f3f3f, cnt, x;

int get(int x) {
    cnt++;
    return fa[x] == x ? x : get(fa[x]);
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        fa[i] = i;
    }
    for (int i = 1; i <= n; ++i) {
        cnt = 0;
        cin >> x;
        if (get(x) == i) {
            ans = min(ans, cnt);
        } else {
            fa[i] = x;
        }
    }
    cout << ans;
    return 0;
}
posted @ 2022-02-02 15:50  ZZHHOOUU  阅读(16)  评论(0编辑  收藏  举报