Luogu P2661 信息传递
一眼就能看出来是个并查集 但是并不会写...
看了一下题解说是并查集求最小环qwq
所以,每次加入第i个小同学,判断如果他要告诉的小同学k最后会告诉他(也就是转回来了),
就说明出现了一个环,这时更新一下最小环;
否则就记一下他要告诉的小同学fa[x](为下一个环做铺垫)
(如果已经找到环就不记,否则下次有小同学指向这个环的时候就会进入死循环(感谢题解))
因为每个点的出度都是1,所以当某几个点已经形成了一个环的时候,他们就不可能属于别的环了,
也就是说每个点只能属于0(入度 = 0)或1个环,
可以得出当前这个点形成的环一定是它所能形成的最优解(最短的)!
当发现环的时候,在getfa里面用一个depth记录深度(环的长度);
至于注意事项...一开始我写的是
int getfa(int x,int &d) {
d++;
if(fa[x] == x)
return x;
return fa[x] = getfa(fa[x],d);
}
然而wa了,对照题解发现最后一句是错的qaq
于是自己写了一堆测试数据才想明白:
因为每次判断都要调用一次getfa函数,所以即使没有找到环,经过的小同学的fa[]也是动态变化的,
这就导致当最后找到环的时候,中间的很多步骤都被跳过了,
并且由于depth每次清零,所以最后得到的depth并不是真正的答案。
解决方案:不改变fa[x]
return getfa(fa[x],d);
(其实我感觉把每个点的步数记下来也可以qwq但是没写出来...以后再说吧x)
完整代码:
#include<cstdio>
#define min(x,y) (x)<(y)?(x):(y)
using namespace std;
int fa[],n,k,dpth,ans = ;
int getfa(int x,int &d) {
d++;
if(fa[x] == x)
return x;
return getfa(fa[x],d);
}
int main() {
scanf("%d",&n);
for(int i = ; i <= n; i++)
fa[i] = i;
for(int i = ; i <= n; i++) {
scanf("%d",&k);
dpth = ;
if(getfa(k,dpth) == i)
ans = min(ans,dpth);
else
fa[i] = k;
}
printf("%d",ans);
return ;
}
Luogu P2661 信息传递的更多相关文章
- luogu P2661 信息传递 x
P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...
- 【luogu P2661 信息传递】 题解
题目链接:https://www.luogu.org/problemnew/show/P2661#sub 一种利用并查集求最小环的做法: 对于每个同学看作一个点,每次信息传递是一条有向边,当出现最小环 ...
- P2661 信息传递
P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...
- P2661 信息传递 DFS
题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...
- 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2
P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...
- 洛谷 P2661 信息传递 题解
P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...
- 洛谷P2661 信息传递(最小环,并查集)
洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...
- 洛谷 P2661 信息传递(并查集 & 最小环)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...
- 洛谷——P2661 信息传递
https://www.luogu.org/problem/show?pid=2661#sub 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其 ...
随机推荐
- 移动端FastClick和editor冲突问题。
FastClick.prototype.needsClickForParent = function (target) { let parent = target.parent ...
- linux学习笔记-文件相关知识
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.文件属性 在当前用户家目录下以ls -al命令输出为例: -rw-r--r-- 1 renren ...
- js之选项卡(tag标签)
目标效果:点击不同按钮显示不同内容 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- pygame编组(精灵组)Group中的常用方法介绍
说明: 1.以下所用的Group均为Group类的对象实例 2.Group类是对AbstractGroup类的继承 sprite.py文档中描述如下: class Group(AbstractGrou ...
- Tensorflow高效读取数据
关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow ...
- Flutter 相机定制
Flutter中与硬件相关的部分,一直都挺蛋疼的.方案基本上有两种,自己写,或者等出相关的库. 最近做的一个项目中,需要对相机做定制.有过相关模块开发经验的,就知道这种需求并不简单,况且是这种跨平台解 ...
- springboot 学习之路 22 (读取自定义文件)
springboot读取自定义的properties文件: package com.huhy.demo.properties; import lombok.Data; import org.sprin ...
- Python:GUI之tkinter学习笔记3事件绑定
相关内容: command bind protocol 首发时间:2018-03-04 19:26 command: command是控件中的一个参数,如果使得command=函数,那么点击控件的时候 ...
- Wim镜像编辑
1.挂载install.wim文件为本地的一个文件夹 dism /mount-wim /wimfile:D:\install.wim /index:1 /mountdir:D:\Win 注:1> ...
- rbac models
class Permission(models.Model): """ 权限表 """ perm_name = models.CharFie ...