★☆   输入文件:2015message.in   输出文件:2015message.out   简单对比
时间限制:1 s  
内存限制:256 MB

【题目描述】

有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。

游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?

【输入格式】

输入共2行。

第1行包含1个正整数n表示n个人。

第2行包含n个用空格隔开的正整数T1,T2,……,Tn其中第i个整数Ti示编号为i

的同学的信息传递对象是编号为Ti的同学,Ti≤n且Ti≠i

数据保证游戏一定会结束。

【输出格式】

输出共 1 行,包含 1 个整数,表示游戏一共可以进行多少轮。

【样例输入】

5

2 4 2 3 1

【样例输出】

3

【提示】

游戏的流程如图所示。当进行完第 3 轮游戏后, 4 号玩家会听到 2 号玩家告诉他自

己的生日,所以答案为 3。当然,第 3 轮游戏后, 2 号玩家、 3 号玩家都能从自己的消息

来源得知自己的生日,同样符合游戏结束的条件。

对于 30%的数据, n ≤ 200;

对于 60%的数据, n ≤ 2500;

对于 100%的数据, n ≤ 200000。

【来源】

在此键入。

Pascal
C
C++

一开始用vector居然还能搞四十分

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<stack>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=;
int n;
struct node
{
vector<int>v;
int num,to,but;
}a[MAXN];
int main()
{
freopen("2015message.in","r",stdin);
freopen("2015message.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i].to),a[i].num=,a[i].v.push_back(i); int ans=;
while()
{
ans++;
for(int i=;i<=n;i++)
{
for(int j=;j<=a[i].num-a[i].but;j++)// i 把知道的所有人的信息跟to说
{
//a[a[i].to].num++;
vector<int>::iterator s=find(a[i].v.begin(),a[i].v.end(),a[i].v[j]);
if(s!=a[i].v.end())
{
a[a[i].to].v.push_back(a[i].v[j]);
a[a[i].to].num++;
a[a[i].to].but++;
} }
//print(i);
for(int j=;j<=a[a[i].to].num;j++)
if(a[a[i].to].v[j]==a[i].to)
printf("%d",ans),exit();
}
for(int i=;i<=n;i++)
a[i].but=;
}
return ;
}

正确做法dfs求最小值

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<stack>
#include<vector>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=;
int n,a[MAXN];
int vis[MAXN];
int ans=0x7ffffff;
stack<int>s;
int dfs(int x)
{
s.push(x);
int num=;
while(!s.empty())
{
int te=s.top();
if(!vis[te])
{
s.push(a[te]);
vis[te]=-;
}
else if(vis[te]==-)
{
s.pop();
vis[te]=;
num++;
while(vis[s.top()]!=)
{
vis[s.top()]=;
s.pop();
num++;
}
s.pop();
while(!s.empty())
{
vis[s.top()]=;
s.pop();
}
}
else if(vis[te]==)
{
while(!s.empty())
{
vis[s.top()]=;
s.pop();
}
}
}
return num;
}
int main()
{
freopen("2015message.in","r",stdin);
freopen("2015message.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]); for(int i=;i<=n;i++)
{
if(!vis[i])
{
int p=dfs(i);
if(p!=)
ans=min(ans,p);
}
}
printf("%d",ans);
return ;
}

2105. [NOIP2015] 信息传递的更多相关文章

  1. [NOIP2015]信息传递

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

  2. LOJ2421 NOIP2015 信息传递 【tarjan求最小环】

    LOJ2421 NOIP2015 信息传递 LINK 题目大意就是给你一个有向图,求最小环 有一个很奇妙的性质叫做每个点只有一条出边 然后我们考虑对每个强联通分量进行考虑 发现每个强联通分量内的边数一 ...

  3. [并查集][NOIP2015]信息传递

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

  4. [vijos]P1979 NOIP2015 信息传递

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

  5. [洛谷P2661] NOIP2015 信息传递

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

  6. Luogu P2661 [NOIP2015] 信息传递

    qwq 今天做完并查集突然想起来这道以前做的好(shui)题, 虽然是黄题,但是是并查集一个比较特别的用法 这道题大概可以用求最小环的方式来做,但是从直觉上果然还是并查集w 乍一看只要求出“父→子”即 ...

  7. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

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

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

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

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

随机推荐

  1. win7系统下重启之后打印机服务就会自动停止的解决方法

    win7系统下重启之后打印机服务就会自动停止的解决方法: 第一步.进入Win7系统后,您需要启动win7系统的任务管理器窗口,然后切换到进程这一栏中,将spoolsv.exe运行进程结束掉.之后,您同 ...

  2. 013 IPv6

    Router>en Router#config t Enter configuration commands, one per line.  End with CNTL/Z. Router(co ...

  3. Android 圆形/圆角图片的方法

    Android 圆形/圆角图片的方法 眼下网上有非常多圆角图片的实例,Github上也有一些成熟的项目.之前做项目,为了稳定高效都是选用Github上的项目直接用.但这样的结束也是Android开发必 ...

  4. 安装eclipse中html/jsp/xml editor插件以及改动html页面的字体

    近期在做android项目,用到了jquery mobile 框架以及phonegap,所以就会涉及一些html文件,可是html文件打开的方式是Text Editor ,而且打开之后一些html代码 ...

  5. GMT和CST的转换

    GMT时间是格林尼治标准时间.CST时间是指包含中国.美国.巴西,澳大利亚四个时区的时间. 在javascript中默认CST是指美国中部时间,倘若在javascript中GMT转换CST则两者相差1 ...

  6. 读书笔记:Information Architecture for the World Wide Web, 3rd Edition 北极熊 第一部分 1-3

    Introducing Information Architecture 信息架构简介 Chapter 1 Defining Information Architecture 信息架构的意义(我们盖房 ...

  7. iOS MMDrawerController源码解读(一)

      提前说好,本文绝对不是教你如何使用MMDrawerController这个第三方库,因为那太多人写了 ,也太简单了.这篇文章主要带你分析MMDrawerController是怎么实现抽屉效果,明白 ...

  8. 复合页( Compound Page )

    复合页(Compound Page)就是将物理上连续的两个或多个页看成一个      独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage).      也能够用来创建透明大页( ...

  9. iOS开发——swift——swift与OC之间不得不知道的21点

    swift与OC之间不得不知道的21点   自6月的WWDC大会上由苹果的大神Chris Lattner向我们首次展示swift至今已经大半年时间了,虽然绝大部分软件公司代码里还都见不到一丁点swif ...

  10. 稀疏表达是要求信号在该模型下的sparse code,只有少数的non-zero elements

    为什么sparse representation比起其它成分分析方法(DFT,Wavelet)能得到更好的效果? - 知乎  https://www.zhihu.com/question/241241 ...