洛谷2661 信息传递
思路:
每个人一开始只知道自己的生日——并查集初始化
对于每个人,如果他不在集合里(父节点仍然是自己),就加入集合(把父节点改为给自己传话的人);
如果它构成环,则维护最小环
#include <bits/stdc++.h>
using namespace std;
int fa[200005];
int tans, ans = 1e9;
int Find(int x) {
tans++;
if(fa[x] == x) {
return x;
}
else {
return Find(fa[x]);
}
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i ++) {
fa[i] = i;
}
for (int i = 1; i <= n; i ++) {
int x;
cin >> x;
tans = 0; //当前环的节点数
if(Find(x) == i) { //构成环
ans = min(ans, tans); //维护最小环
}
else {
fa[i] = x;
}
}
return cout << ans, 0;
}