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;
}
posted @ 2021-08-12 18:55  皮使我快乐  阅读(35)  评论(0)    收藏  举报