2015 提高组 信息传递--tarjan找最小环
P2661 信息传递
题目描述
有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。
游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮?
输入输出格式
输入格式:
共 2 行。
第 1 行包含1个正整数 n ,表示 n 个人。
第 2 行包含 n 个用空格隔开的正整数 T1,T2,⋯⋯,Tn ,其中第 i个整数 Ti 表示编号为 i 的同学的信息传递对象是编号为 Ti 的同学, Ti≤n 且Ti≠i 。
输出格式:
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 。
这题暴力的话好像是真的难写。
信息传递,在两个可以相互传递的人之间连边(单向),表示信息的传递,然后这个题不就变成了,求从图中某一个点的出发绕回自己的最短路径了吗,显然这不就是利用tarjan求最小环么?
所以这题不就解决了嘛。
#include <iostream>
#include <cstdio>
#define N int(2e5+2)
using namespace std;
struct ahah{
int nxt,to;
}edge[N];
int n,x,ans,vis[N];
int head[N],tot;
void add(int x,int y)
{
edge[++tot].nxt=head[x],edge[tot].to=y,head[x]=tot;
}
int dfn[N],low[N],index;
int stack[N],top;
bool in[N];
int belong[N],cnt;
void tarjan(int s)
{
dfn[s]=low[s]=++index;
in[s]=;stack[++top]=s;
for(int i=head[s];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v);
if(low[v]<low[s])low[s]=low[v];
}
else if(in[v]&&low[s]>dfn[v])low[s]=dfn[v];
}
if(dfn[s]==low[s])
{
int p;
cnt++;
do
{
p=stack[top--];
in[p]=;
belong[p]=cnt;
}while(p!=s);
}
}
int main()
{
ans=;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&x),add(i,x);
for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int i=;i<=n;i++)vis[belong[i]]++;
for(int i=;i<=n;i++)
{
if(vis[i]>)ans=min(ans,vis[i]);
}
printf("%d",ans);
}
2015 提高组 信息传递--tarjan找最小环的更多相关文章
- NOIP2015提高组 信息传递 ---并查集问题
题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. 游戏开始时,每人都只 ...
- [NOIp2015提高组]信息传递
OJ题号:洛谷2661 思路:求最小环.DFS+记忆化. #include<cstdio> #include<cstring> #include<algorithm> ...
- 2015 NOIP day2 t2 信息传递 tarjan
信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Descrip ...
- NOIP 2015提高组复赛
神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...
- NOIP 2015 提高组 Day1
期望得分:100+100+100=300 实际得分:100+100+45=245 T3 相似的代码 复制过去 没有改全,痛失55分 http://www.cogs.pro/cogs/page/page ...
- P2661 信息传递 二分图的最小环
题目描述 有 nn 个同学(编号为 11 到 nn )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 ii 的同学的信息传递对象是编号为 T_iTi 的同学. 游戏开 ...
- NOIP 2015 提高组 Day2
期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s ...
- noip 2015 提高组
算是填个坑吧 , QwQ Day 1 第一题很水,就是考代码能力 ,直接贴代码. #include <iostream> #include <cstdlib> #include ...
- P2661 信息传递
P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...
随机推荐
- Vue-i18n实现语言切换
方法1 Vue — i18n 国际化 全局配置 安 装 1.直接引入js文件 <script src="https://unpkg.com/vue/dist/vue.js"& ...
- git中文件的三种状态
用xcode的时候,左侧栏文件的邮右边时不时会看到M,A这一类的字母.当然,这些以后再写上.先说一下git里文件的三种状态 已提交(committed) 已经提交的本地仓库(repository), ...
- poj3181【完全背包+整数拆分】
题意: 给你一个数n,在给你一个数K,问你这个n用1-k的数去组合,有多少种组合方式. 思路: 背包重量就是n: 那么可以看出 1-k就是重物,价值是数值,重量是数值. 每个重物可以无限取,问题转化为 ...
- 洛谷P4841 城市规划(多项式求逆)
传送门 这题太珂怕了……如果是我的话完全想不出来…… 题解 //minamoto #include<iostream> #include<cstdio> #include< ...
- 超完整的Chrome浏览器客户端调试大全
引言 “工欲善其事,必先利其器” 没错,这句话个人觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能干专业的事,这个 ...
- 查看软件安装的位置 Ubuntu
Ubuntu和windows不一样,不是所有的软件都在一个文件夹,而是不同类型的分散在不同的文件夹下 所以查找起来也是不同的 如果知道是用 apt-get install 方法安装的,可以直接用 dp ...
- vs2010中的ADO控件及绑定控件
要在项目中添加某一个ActiveX控件,则该ActiveX控件必须要注册.由于VS2010中,并没有自动注册ADO及ADO数据绑定控件(Microsoft ADO Data Control,Micro ...
- UWP 动画
一:StoryBoard 一般翻译成演示图版或者故事板,就像电影中的情节串联板,它是一个动画时间线的容器. 二:动画的分类 简单动画:以Animation结尾,例如DoubleAnimat ...
- BZOJ1833(数位dp)
这个数位dp倒是没什么限制条件,只是需要在过程中把每个数字出现次数记录一下即可.记忆化返回时数学算出.框架还是套板子. #include <cstdio> #include <cma ...
- rac 添加 资源
10g : 自动化.监控.os,存储,底成,网络,规范