P2661 信息传递[最小环+边带权并查集]
题目来源:洛谷
题目描述
有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。
游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮?
输入输出格式
输入格式:
共2行。第1行包含1个正整数 n ,表示 n 个人。
输出格式:
1个整数,表示游戏一共可以进行多少轮。
输入输出样例
5
2 4 2 3 1
3
说明
样例1解释

游戏的流程如图所示。当进行完第3 轮游戏后, 4号玩家会听到 2 号玩家告诉他自己的生日,所以答案为 3。当然,第 3 轮游戏后, 2号玩家、 3 号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。
对于 30%的数据, n≤200;
对于 60%的数据,n ≤2500;
对于 100%的数据, n≤200000。
解析:
在想了半天之后还是去看了题解,我真tm弱。
写这道题看标签有个并查集,结果实际上是坑人的。这哪里是并查集啊喂?!虽说也是吧,但是与其说是并查集,倒不如说是用并查集这种思想记录一下数据之间的关系。。。
这个关系,其实就是某节点信息当前传递到的节点的位置而已,可以把它看成一条链,我们称其为“信息传递链”。
这道题其实是求最小环。。。其他最小环算法也可以搞定。
2019-06-04 更新
咳咳,看来是本蒟蒻见识短浅了,经过几天学习,发现这种并查集叫边带权并查集,它能很好的维护带有传递性的关系。
具体来讲,就是在路径压缩时同步更新某些信息,让每个节点之间的关系得以体现。
这道题可以作为边带权并查集的入门模板,如果要深入学习,建议看看这两道题:P1196 [NOI2002]银河英雄传说 P1197 [JSOI2008]星球大战
这道题稍微有点难以理解,因为如果要用并查集做,要稍微做一点转换。
本题所谓的信息传递,实际上每次传递就相当于在有向图中连一条边,在并查集中记录父节点,由于并查集带权,我们开一个数组d[]记录一下就好了。
而当某个节点得知自己的信息时,说明在有向图中构成了一个环。而题目便是要求我们求一个最小环了。
注意不要把前驱和后继搞混了。。。
PS:如果把本题看作一张有向图,那么自始至终这张图都不会出现一个环,因为如果连接任意一个环,之后查找这个环中某一结点的父节点时,就会陷入死循环。
参考代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define N 200010
using namespace std;
int fa[N],d[N],ans;
int get(int x)
{
if(x!=fa[x])
{
int pre=fa[x];
fa[x]=get(fa[x]);
d[x]+=d[pre];//将之前节点到父节点的距离传递
}
return fa[x];
}
void query(int x,int y)
{
int a=get(x),b=get(y);
if(a!=b)
{
fa[a]=b;
d[x]=d[y]+;//连接一条边
}
else
{
ans=min(ans,d[x]+d[y]+);//注意此处并没有连成一个环!
}
}
int main()
{
int n,x;
scanf("%d",&n);
for(int i=;i<=n;i++) fa[i]=i;
ans=0x7fffffff;
for(int i=;i<=n;i++){
scanf("%d",&x);
query(i,x);
}
printf("%d\n",ans);
return ;
}
2019-05-26 12:59:29
P2661 信息传递[最小环+边带权并查集]的更多相关文章
- 【NOIP 2015 D1 T2】信息传递(图论--带权并查集/bfs)
题目:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...
- 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- AcWing 238.银河英雄传说 (边带权并查集)
题意:有\(n\)列,有\(T\)条指令,若指令格式为\(M\),则将第\(i\)号的所有战舰移到第\(j\)号所在列的后面,若指令格式为\(C\),询问\(i\)和\(j\)是否在同一列,如果在,问 ...
- 洛谷P2661 信息传递(最小环,并查集)
洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...
- 【poj1733】Parity game--边带权并查集
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15776 Accepted: 5964 Description Now ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- P2661 信息传递 二分图的最小环
题目描述 有 nn 个同学(编号为 11 到 nn )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 ii 的同学的信息传递对象是编号为 T_iTi 的同学. 游戏开 ...
- P2661 信息传递
P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...
随机推荐
- 虚拟机中windows下制作超级隐藏账户
这篇博客非原创,我只是将很多大佬写的东西理解了一下写了出来. 接下来的实验最好在虚拟机进行,因为可以快照~ 制作隐藏用户可以说是两种方法但是基本操作一样,所以我们穿插着进行一种是隐藏账户,一种是影子账 ...
- [WCF] - 访问任意方法耗时长问题之解决
问题 访问 WCF 任意方法耗时都很长(15s+) 原因 当执行语句 log4net.Config.XmlConfigurator.Configure(); 时需要连接到 log4net 对应的数据库 ...
- mysql 添加大量测试数据
mysql 添加大量测试数据 场景 针对于大量测试数据插入,检测sql执行速度 第一步:建表 // 测试表 CREATE TABLE user ( id int(11) NOT NULL AUTO_I ...
- 剑指offer55:链表中环的入口结点
1 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 2 思路和方法 这是一个典型的链表中查找环的问题,基本思路是,首先设置两个快慢指针slow和fast,并且快指 ...
- Python 用(无脑 and 有脑)方式解决小练习
题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成, 高于10万元的部分,可提成7.5%:20万到4 ...
- Istio技术与实践6:Istio如何为服务提供安全防护能力
凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. 那么,便引出3个问题: l Istio凭什么保护服务? l ...
- SQL Server邮件标识点
<br>---换行  :---空格 <H1></H1>---标题 --定义表格格式 N'<table border="1" ...
- 3_PHP表达式_2_变量
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP变量可分为自定义变量和预定义变量. 以下所谈到的变量均为自定义变量. 1.变量的基本概念 PHP的变量名遵循 ...
- python—各种常用函数及库
列表list1.append(x) 将x添加到列表末尾 list1.sort() 对列表元素排序 list1.reverse() 将 ...
- 使用docker安装gitlab
我这里使用的系统是centos7 首先安装docker,docker-compose(非必须,但是使用它可以简化镜像启动参数),需要注意的是docker-compose安装依赖Python的pip,所 ...