题目链接: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;
}