洛谷 P2661 信息传递

有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为(T_i)的同学。

游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?

自己直接被降智,刚开始竟然没想出来

其实就是个并查集求最小环

果然不做做noip题就变傻了= =

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
const int N = 2e5;
using namespace std;
int n,a,fa[N + 5],ans,cnt;
vector <int> d[N + 5];
int find(int x)
{
    cnt++;
    if (x == fa[x])
        return x;
    return find(fa[x]);
}
int main()
{
    scanf("%d",&n);
    for (int i = 1;i <= n;i++)
        fa[i] = i;
    ans = N;
    for (int i = 1;i <= n;i++)
    {
        cnt = 0;
        scanf("%d",&a);
        if (find(a) == i)
            ans = min(ans,cnt);
        else
            fa[i] = a;
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/sdlang/p/13068256.html