地址 https://www.acwing.com/problem/content/description/519/

有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏。

在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 TiTi 的同学。 

游戏开始时,每人都只知道自己的生日。

之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。

当有人从别人口中得知自己的生日时,游戏结束。

请问该游戏一共可以进行几轮?

输入格式
输入共  行。  第  行包含  个正整数 n ,表示 n 个人。  第  行包含 n 个用空格隔开的正整数T1,T2,…,Tn,其中第 i 个整数 Ti 表示编号为 i 的同学的信息传递对象是编号为 Ti 的同学,Ti ≤n 且 Ti ≠i。  数据保证游戏一定会结束。 输出格式
输出共  行,包含  个整数,表示游戏一共可以进行多少轮。 数据范围
n≤
输入样例: 输出样例:

解法

每个人看做点 通讯的途径看做边的话 这里就是求最短的环。

应该可以使用搜索的方式获取最短的环

我们这里没使用这种方式 而是使用tarjan求环

 #include <iostream>
#include <vector>
#include <stack>
#include <algorithm> using namespace std; const int maxn = 2e5 + ;
vector<int> E[maxn];
int vis[maxn];
int dfn[maxn], low[maxn], tot, n, ans = maxn;
stack<int> s; void tarjan(int x)
{
low[x] = dfn[x] = ++ tot;
s.push(x); vis[x] = ; for (int i = ; i < E[x].size(); i++) {
int v = E[x][i];
if (!dfn[v]) {
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if (vis[v]) {
low[x] = min(low[x], dfn[v]);
}
} if (low[x] == dfn[x]) {
int cnt = ;
while () {
int now = s.top();
s.pop();
vis[x] = ;
cnt++;
if (now == x) break;
}
if (cnt > ) ans = min(ans, cnt);
} } int main()
{
scanf("%d",&n );
for (int i = ; i <= n; i++) {
int x;
scanf("%d", &x);
E[i].push_back(x);
} for (int i = ; i <= n; i++) {
if (!dfn[i])
tarjan(i);
} cout << ans << endl; return ;
}

tarjan

还可以考虑使用并查集的办法 找到最小的并查集即可

 #include <iostream>

 using namespace std;

 const int N = +;
int fa[N],n,m,i,j,k,cnt,ans = 1e9; int find(int x)
{
cnt++;
return fa[x]==x?x:find(fa[x]);
} int main(){
cin >> n;
for(int i = ;i <= n;i++)
fa[i] = i;
for(int i = ;i <= n;i++){
int x;
cin >> x;
cnt = ;
if(find(x) == i)
ans = min(ans,cnt);
else
fa[i] = x;
} cout << ans;
return ;
}

acwing 517. 信息传递的更多相关文章

  1. tg2015 信息传递 (洛谷p2661)

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

  2. [NOIP2015]信息传递

    [NOIP2015]信息传递[问题描述]有

  3. [NOIP2015] 提高组 洛谷P2661 信息传递

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

  4. 使用postMesssage()实现跨域iframe页面间的信息传递----转载

    由于web同源策略的限制,当页面使用跨域iframe链接时,主页面与子页面是无法交互的,这对页面间的信息传递造成了不小的麻烦,经过一系列的尝试,最后我发现有以下方法可以实现: 1. 子页面url传参 ...

  5. 洛谷 P2661 信息传递 Label:并查集||强联通分量

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

  6. NOIP 2015 信息传递

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

  7. AC日记——信息传递 洛谷 P2661 (tarjan求环)

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

  8. 2015 NOIP day2 t2 信息传递 tarjan

    信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Descrip ...

  9. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

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

随机推荐

  1. [转]UiPath Build Data Table

    本文转自:https://docs.uipath.com/activities/docs/build-data-table UiPath.Core.Activities.BuildDataTable ...

  2. [20191127]表 full Hash Value的计算.txt

    [20191127]表 full Hash Value的计算.txt --//曾经做过表full Hash Value的计算,当时我是通过建立简单的schema以及表名的形式,使用hashcat破解o ...

  3. docker alphine 设置系统日期

    设置时区为上海 RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && ...

  4. java之可变个数的形参

    //采用数组形参来定义方法 public static void test (int a, String[] books); //采用可变个数形参来定义方法 public static void te ...

  5. JSON.parse解决Unexpected token ' in JSON at position 1报错

     壹 ❀ 引 我们知道JSON.parse能将JSON字符串转变成JS对象,但在一些转换中可能出现Unexpected token ' in JSON at position 1的错误,这是因为被转换 ...

  6. leetcode-二叉树

    树以及常用的算法 树的概念 树(Tree)的基本概念树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构.没有结点的树称为空(null或empty)树.一棵非空的树包括一个根结点 ...

  7. SpringBoot系列之@PropertySource读取yaml文件

    SpringBoot系列之@PropertySource支持yaml文件读取 最近在做实验,想通过@PropertySource注解读取配置文件的属性,进行映射,习惯上用properties都是测试没 ...

  8. 探究JS V8引擎下的“数组”底层实现

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/np9Yoo02pEv9n_LCusZn3Q作者:李超 JavaScript 中的数组有很多特性 ...

  9. SVM算法核函数的选择

    SVM支持向量机,一般用于二分类模型,支持线性可分和非线性划分.SVM中用到的核函数有线性核'linear'.多项式核函数pkf以及高斯核函数rbf. 当训练数据线性可分时,一般用线性核函数,直接实现 ...

  10. java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService

    这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...