P2661 信息传递

题目描述

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

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

输入格式

共\(2\)行。

第\(1\)行包含1个正整数 \(n\) ,表示 \(n\) 个人。

第\(2\)行包含 \(n\) 个用空格隔开的正整数 \(T_1,T_2,\cdots\cdots,T_n\) ,其中第 \(i\) 个整数 \(T_i\)​ 表示编号为 \(i\) 的同学的信息传递对象是编号为 \(T_i\)​ 的同学, \(T_i \leq n\) 且 \(T_i \neq i\) 。

输出格式

\(1\)个整数,表示游戏一共可以进行多少轮。

输入输出样例

输入 #1

5

2 4 2 3 1

输出 #1

3

说明/提示

样例1解释

游戏的流程如图所示。当进行完第 \(3\) 轮游戏后, \(4\) 号玩家会听到 \(2\) 号玩家告诉他自己的生日,所以答案为 \(3\)。当然,第 \(3\) 轮游戏后,\(2\) 号玩家、 \(3\) 号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。

对于 \(30\%\)的数据, \(n ≤ 200\);

对于 \(60\%\) 的数据, \(n ≤ 2500\);

对于\(100\%\)的数据, \(n ≤ 200000\)。

【思路】

时间主要是花在了考虑这个题目和图的关系,在处理题目和图,将看似和图没有关系的题目转化为图的地方掌握的不好

很难想出到底和图有什么联系,再就是在处理深度这一个地方花费了不少的时间

并查集求最小环

把每个同学看成一个点,

信息的传递就是在他们之间连有向边,

游戏轮数就是求最小环。

图论求最小环,我在里面看到了并查集。

假如说信息由A传递给B,

那么就连一条由A指向B的边,

同时更新A的父节点,

A到它的父节点的路径长

也就是B到它的父节点的路径长+1。

这样我们就建立好了一个图,

之后信息传递的所有环节都按照这些路径。

游戏结束的轮数,也就是这个图里最小环的长度。

如果有两个点祖先节点相同,

那么就可以构成一个环,

长度为两个点到祖先节点长度之和+1。

和下面的并查集有点不一样的。

【完整代码】

#include<iostream>
#include<cstdio> using namespace std; const int Max = 200005;
int father[Max];
int d[Max];
int Min; int find(int x)
{
if(x != father[x])//这个本身不是最高祖先还可以更新
{
int last = father[x];//先记录一下没有更新前的父亲是谁
father[x] = find(father[x]);//找出最高祖先
d[x] += d[last];//回溯更新更新最高祖先之后也就是在父亲这一块多了那一部分之后多出来的路径距离
}
return father[x];
} void hebing(int x,int y)
{
int xx = find(x);int yy = find(y);
if(xx == yy)//找到一个环
Min = min(Min,d[x] + d[y] + 1);//求出这个环 的 长度,比较找出最短的环
else
father[xx] = yy,//合并
d[x] = d[y] + 1;//这个点到他的最高祖先的距离就是距离他为1的父亲到这个最高祖先的距离加上他和父亲间距离的这个1就可以去更新了
//上面注意第52行和第53行的xx和yy,x和y的顺序是要对应的,xx对应x,yy对应y
return;
} int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;++ i)father[i] = i;
int a;
Min = 0x7fffffff;
for(int i = 1;i <= n;++ i)
{
cin >> a;
hebing(i,a);
}
cout << Min <<endl;
return 0;
}

洛谷 P2661 信息传递 题解的更多相关文章

  1. 洛谷p2661信息传递题解

    题目 这个题一眼看上去就是用并查集求最小环. 我们可以设两个数组分别是f,d分别表示该点的爸爸和该点到祖先的距离. 当该点的爸爸等于他时,那他肯定就是祖先. 此时信息就肯定传递完了,此时的整个图中(我 ...

  2. 洛谷P2661 信息传递(最小环,并查集)

    洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...

  3. 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...

  4. 洛谷 P2661 信息传递(并查集 & 最小环)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...

  5. [NOIP2015] 提高组 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  6. 洛谷 P2661 信息传递 Label:并查集||强联通分量

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  7. NOIP2015提高组T2 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  8. 洛谷——P2661 信息传递

    https://www.luogu.org/problem/show?pid=2661#sub 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其 ...

  9. 洛谷 P2661信息传递

    图论——>并查集 P2661 本蒟蒻啥也不会 这题还WA了1次 =  = 最后看题解A 哭了 看题是多个(N<=200000)东西之间的关系维护 果断想到并查集 在第i个位置的a[i] 表 ...

随机推荐

  1. 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  2. Lucene BooleanQuery中的Occur.MUST与Occur.Should

    https://www.cnblogs.com/weipeng/archive/2012/04/18/2455079.html   1.  多个MUST的组合不必多说,就是交集 2.  MUST和SH ...

  3. Sql 脚本文件太大 还原数据库

    sql脚本太大直接在数据库中执行会提示内存不足,我们看生成的脚本文件会发现每隔100条会有一个GO来分隔,这就好说了 在我将数据库的结构连同数据生成一个脚本文件db.sql 后,想在另外的电脑上恢复数 ...

  4. js注意点

    1.在JS中:var a=''; 则 a==0或a==false 结果都为true;  如果是“====” 则为false

  5. there is no route defined for key Agreement(react native bug记录)

    调试react native的项目有一个报错: there is no route defined for key XXXX 它发生在我调试TabNavigator选项卡路由器的时候,我把如下代码的A ...

  6. SQL+C#:一次多语言混合编程的经验总结

    1.用JAVA做,采取轮询策略: 2.用sql语言+C#混合编程,采取触发策略

  7. Python学习日记(九) 装饰器函数

    1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...

  8. kubernetes 集群添加node节点

    kubernetes 集群添加node节点 注意,我们并不需要把新增的node ip加入到证书里重新生成!!! 下面我们以添加node03为例 一.添加集群里个节点的hostname并设置好对应主机名 ...

  9. 用python实现数据库查询数据方法

    哈喽,好久没来了,最近搞自动化发现了很多代码弯路,特别分享出来给能用到的朋友 因为公司业务的关系,每做一笔功能冒烟测试,我们就要对很多的数据库表中的字段进行校验,当时我就想反正总是要重复的运行这些SQ ...

  10. Linux下环境变量设置 (转)

    Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...