AcWing 517.信息传递
有$n$个同学(编号为$1$到$n$)正在玩一个信息传递的游戏。
在游戏里每人都有一个固定的信息传递对象,其中,编号为$i$ 的同学的信息传递对象是编号为$i$的同学。
游戏开始时,每人都只知道自己的生日。
之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信 息传递对象)。
当有人从别人口中得知自己的生日时,游戏结束。
请问该游戏一共可以进行几轮?
输入格式
输入共$2$行。
第$1$行包含$1$个正整数$n$,表示$n$个人。
第$2$行包含$n$个用空格隔开的正整数$T_1,T_2,…,T_ n$,其中第$i$个整数$T_i$表示编号为$i$的同学的信息传递对象是编号为$T_i$的同学,$T_i \neq n$ 且 $T_i \neq i$。
数据保证游戏一定会结束。
输出格式
输出共$1$ 行,包含$1$个整数,表示游戏一共可以进行多少轮。
数据范围
$n \le 200000$
输入样例:
5
2 4 2 3 1
输出样例:
3
代码
(并查集)#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=210000;//数据范围
int fa[N],n,m,i,j,k,cnt,ans=1e9;//ans初始化
int find(int x){
cnt ++;
if(fa[x] == x){
return x;
}else{
return find(fa[x]);
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 1; i <= n; i++){
int x;
cin >> x;
cnt = 0;
if(find(x) == i){
ans = min(ans,cnt);
}else{
fa[i] = x;
}
}
cout << ans;
return 0;
}
要一直快乐

浙公网安备 33010602011771号