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;
}

最新文章

  1. alias指令:设置命令别名
  2. 《C#并发编程经典实例》笔记
  3. php提供更快的文件下载
  4. 开始使用DOJO(翻译)
  5. 什么是xmlschema
  6. Linux下多线程,断点续传,命令行下载工具axel
  7. 问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the &quot;BlueView&quot; nib but the view outlet was not set.
  8. 在Firefox中通过AJAX跨域访问Web资源---
  9. NodeJS -Express 4.0 用include取代partial
  10. QT5 TK1 串口通信
  11. Struts2 Action接收表单参数
  12. Python3基础 setdefault() 根据键查找值,找不到键会添加
  13. 4.Handler之CoreHandler编写
  14. MFC的两个问题
  15. ASP .NetCore 部署500错误 查看异常详情
  16. iOS.BackgroundTask
  17. input输入框添加内部图标
  18. hierarchyid有关的一些函数
  19. Bootstrap_CSS概览
  20. 在VC中创建DLL文件的方法步骤

热门文章

  1. Gym 102055B Balance of the Force
  2. Java日志logback使用
  3. node-red 安装
  4. Java 处理异常
  5. [unity]GPU Instance学习
  6. JQ分页的使用
  7. JDK的安装(mac)
  8. VsCode使用setting sync 同步自己的插件和设置等
  9. mysql查看当前实时连接数
  10. 完成N!的程序编写: 1、用循环算法编写; 2、用递归算法编写;