传送门

一眼就能看出来是个并查集 但是并不会写...

看了一下题解说是并查集求最小环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 信息传递的更多相关文章

  1. luogu P2661 信息传递 x

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...

  2. 【luogu P2661 信息传递】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2661#sub 一种利用并查集求最小环的做法: 对于每个同学看作一个点,每次信息传递是一条有向边,当出现最小环 ...

  3. P2661 信息传递

    P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...

  4. P2661 信息传递 DFS

    题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...

  5. 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...

  6. 洛谷 P2661 信息传递 题解

    P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...

  7. 洛谷P2661 信息传递(最小环,并查集)

    洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...

  8. 洛谷 P2661 信息传递(并查集 & 最小环)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...

  9. 洛谷——P2661 信息传递

    https://www.luogu.org/problem/show?pid=2661#sub 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其 ...

随机推荐

  1. APP如何进行通信的

    什么是B/S架构(Browser/server):浏览器和服务器架构

  2. lnmp首次安装重置mysql密码

    第一种方法:一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wget http://soft.vpser.net/lnmp/ext/reset_mysql_ ...

  3. setTimeout.js

    var cyn = function(){ console.log("我是延时输出的函数") } setTimeout(cyn,5000)

  4. Bootstrap 、AngularJs

    SPA 全称:single-page application单页面应用 说明:类似原生客户端软件更流畅的用户体验的页面.所有的资源都是按需加载到页面上. JSR 全称:Java Specificati ...

  5. SQL Anywhere5.5: Metadata

    http://dcx.sybase.com/1101/en/dbprogramming_en11/ianywhere-data-sqlanywhere-saconnection-getschem633 ...

  6. Chrome及Chrome内核浏览器改变开发者工具字体大小

    1.打开浏览器,按F12调用开发者工具 2.按Ctrl+数字加号键,可看到字体变大,按Ctrl+数字减号键,字体变小 3.重新启动浏览器后字体仍然保持修改后的字体大小

  7. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  8. python 机器学习中模型评估和调参

    在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...

  9. 1.2 Spyder的基本使用

    [TOC] 1.0 Spyder的基本使用 1.Spyder的主题与文字修改: 2.Spyder的使用技巧: (一)安装Anaconda: 官网下载:https://www.anaconda.com/ ...

  10. scrapy爬虫天猫笔记本电脑销量前60的商品

    # 抓取内容:商品名称,商品价格,商品链接,店铺名称,店铺链接 # 爬取的时候之前返回了多次302,301 但是html网页还是被爬取下来了 抓取的首页: start_urls = ['https:/ ...