洛谷 P2661 信息传递 题解
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 信息传递 题解的更多相关文章
- 洛谷p2661信息传递题解
题目 这个题一眼看上去就是用并查集求最小环. 我们可以设两个数组分别是f,d分别表示该点的爸爸和该点到祖先的距离. 当该点的爸爸等于他时,那他肯定就是祖先. 此时信息就肯定传递完了,此时的整个图中(我 ...
- 洛谷P2661 信息传递(最小环,并查集)
洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...
- 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2
P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...
- 洛谷 P2661 信息传递(并查集 & 最小环)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...
- [NOIP2015] 提高组 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 洛谷 P2661 信息传递 Label:并查集||强联通分量
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- NOIP2015提高组T2 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 洛谷——P2661 信息传递
https://www.luogu.org/problem/show?pid=2661#sub 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其 ...
- 洛谷 P2661信息传递
图论——>并查集 P2661 本蒟蒻啥也不会 这题还WA了1次 = = 最后看题解A 哭了 看题是多个(N<=200000)东西之间的关系维护 果断想到并查集 在第i个位置的a[i] 表 ...
随机推荐
- Elasticsearch-6.7.0系列(七)SpringCloud连接ES集群,使用ES用户名密码
pom.xml代码: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...
- VsCode中好用的git源代码管理插件GitLens
1.在插件tab搜索GitLens 2.安装成功后将光标移至代码行即会显示代码编写者 3.在VsCode左侧菜单栏,点击GitLens图标即可查看History,也可以查看全部的日志 4.查看上下pu ...
- win10 idea启动Tomcat后控制台中文乱码
idea 配置文件新增如下配置 -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8
- 【转载】Asp.net网站安全:去除网站根目录下的备份文件防止代码泄露
很多网站运维人员在更新网站版本的时候,喜欢直接在网站目录文件夹中直接压缩原来的网站文件,如果这个备份压缩文件没有移动出去,这样是非常不安全的,有些网站攻击者可能会尝试访问你网站下有没有对应名字的压缩备 ...
- 关于移动端图片浏览,previewimage的使用
我相信在移动端项目中,大家都会遇到图片浏览的问题,像qq,微信,微博,淘宝,当你点击图片时,图片会放大全屏显示,双击图片时图片继续放大查看,双指左右滑动也可以放大,当你再次点击时图片,图片恢复原始大小 ...
- UCOSIII系统内部任务
1. 空闲任务 空闲任务是UCOSIII创建的第一个任务 空闲任务是UCOSIII必须创建的 空闲任务优先级总是为OS_CFG_PRIO_MAK-1 空闲任务中不能调用任何可使空闲任务进入等待态的函数 ...
- 我与SAP成都研究院吴院长的二三事
这几天Jerry没怎么看手机,今天才注意到,昨天SAP中国研究院公众号上发布了一篇文章:SAP高管说: 体验经济时代下的SAP客户体验.仔细一看,这不是咱SAP成都研究院的吴院长么. 在今年没有发生部 ...
- org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案
org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案 背景描述 Sprin ...
- mysql的左连接问题
之前写过一个mysql语句,功能是将一个表ds的一个字段值同步更新到另一个表bk的字段,不过不是全部,只更新表bk中有的数据,如果表bk中有而表ds中没有,表B对应的这个字段值就为空 UPDATE b ...
- Python学习日记(十二) 匿名函数
匿名函数: 未解决一些简单的需求而设计的函数 语法: func = lambda x : x**2 func:函数名 lambda:类似def的关键字 x:参数 x**2:返回值表达式 适用内置函数: ...