zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    
  • 相关阅读:
    C# vb .net实现淡出效果特效滤镜
    <<薪资至少10K的一道题,你能拿下吗>>练习
    职场生存规则--水
    简单摸拟电梯程序
    回收期计算
    徒手写汉诺塔
    没有方法的算法代码
    听说是阿里笔试题
    工作任务的分解
    纯吐槽,关于现在的一些混乱情况.
  • 原文地址:https://www.cnblogs.com/sdlang/p/13068256.html
Copyright © 2011-2022 走看看