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)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其 ...
随机推荐
- ngx-echarts响应式图表
一.代码 html代码 <!-- html --> <nz-card style="background-color: #0e0b2a;border: 0px;color: ...
- 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)
题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然 ...
- jquery制作移动端菜单栏左右滑动
//菜单栏滑动function move_scollX(){ var startPosition, endPosition, distanceX,distanceY; $(".left&qu ...
- (后端)Java中关于金额大小写的工具类
/** * 金额小数转换成中文大写金额 * * @author Neil Han * */ private static final String UNIT[] = { "万", ...
- python 遇到的小坑
由于前端资源紧缺,我的后端系统迟迟等不来它的前端,没办法只好自己来写了.从html,js入门学起,然后照着vue.js的官方教程写了几个实例,从github上clone了一个不错的vue.js模版,填 ...
- PHP开发APP接口学习笔记
习要点概述1.APP接口简介 2.封装通信接口方法 3.核心技术 4.APP接口实例 服务器和客户端进行接口数据通信:服务器 -->数据库|缓存 -->调用接口 -->客户端 服务器 ...
- SQL Server 2012 读写分离设置 - AlsoIn
原文转至:http://www.tuicool.com/articles/a6rmiam/ 引用: http://technet.microsoft.com/zh-cn/library/jj16176 ...
- Java新建Web应用与配置Tomcat流程
1. 新版本IDEA新建Web应用后没有web.xml文件,需要通过下图方式添加 2. IDEA中的web文件夹相当于eclipse里的WebRoot文件夹,在里面新建WEB-INF文件夹,再创建cl ...
- python装饰器的实现
说起装饰器我们可能已经很熟悉了(不了解的可以查看python基础学习——装饰器),随手就可以写一个简单的装饰器 def decorator(func): def inner(*args, **kwar ...
- 【PAT】B1036 跟奥巴马一起编程(15)(15 分
#include<stdio.h> int main() { int row,col; char c; scanf("%d %c",&col,&c); ...