★☆   输入文件: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. Ubuntu 16.04出现chmod: 无效模式:"a"的问题解决

    命令: chmod a+x file1 提示:注意文件的类型,如果用在文件夹上是不行的,但是文件确实可以的.

  2. JDBC的存储过程

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/stored-procedure.html: 正如一个Connection对象创建了Statement和 ...

  3. JDBC操作MySQL出现:This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, ...的问题解决

    错误如下: This result set must come from a statement that was created with a result set type of ResultSe ...

  4. Systemtap工具查看系统资源使用

    http://www.xbwolf.com/507 http://blog.csdn.net/kafeiflynn/article/details/6429976 安装步骤yum install sy ...

  5. [转]Attribute在.net编程中的应用

    Attribute在.net编程中的应用(一) Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是 ...

  6. Guass列主元、平方根法、追赶法求解方程组的C++实现

    一,要解决的问题 选用合适的算法,求解三种线性方程组:一般线性方程组,对称正定方程组,三对角线性方程组. 方程略. 二,数值方法 1,使用Guass列主元消去法求解一般线性方程组. Guass列主元是 ...

  7. 滚动载入server端内容——样例

    网页代码例如以下 <!doctype html> <html> <head> <meta charset="utf-8"> < ...

  8. mybatis中批量插入数据

    <insert id="insertIntoDevAct" parameterType="java.util.List"><foreach c ...

  9. MySQL-删除数据(DELECT)

    数据库备份介绍: 数据库一旦删除数据,它就会永远消失. 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据. MySQL提供了非常有用的工具,用于在服务器上本地备份或转储M ...

  10. OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解

    近期发现了一个好的opencv博客,准备依照他的顺序系统学习opencv,而且会一一转载过来 之前啃了不少OpenCV的官方文档,发现假设了解了一些OpenCV总体的模块架构后.再重点学习自己感兴趣的 ...