2105. [NOIP2015] 信息传递
2018-06-17 22:32:17来源:未知 阅读 ()
★☆ 输入文件: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。
【来源】
在此键入。
一开始用vector居然还能搞四十分
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<map> 6 #include<stack> 7 #include<vector> 8 #include<cstdlib> 9 #include<algorithm> 10 using namespace std; 11 const int MAXN=200001; 12 int n; 13 struct node 14 { 15 vector<int>v; 16 int num,to,but; 17 }a[MAXN]; 18 int main() 19 { 20 freopen("2015message.in","r",stdin); 21 freopen("2015message.out","w",stdout); 22 scanf("%d",&n); 23 for(int i=1;i<=n;i++) 24 scanf("%d",&a[i].to),a[i].num=0,a[i].v.push_back(i); 25 26 int ans=0; 27 while(1) 28 { 29 ans++; 30 for(int i=1;i<=n;i++) 31 { 32 for(int j=0;j<=a[i].num-a[i].but;j++)// i 把知道的所有人的信息跟to说 33 { 34 //a[a[i].to].num++; 35 vector<int>::iterator s=find(a[i].v.begin(),a[i].v.end(),a[i].v[j]); 36 if(s!=a[i].v.end()) 37 { 38 a[a[i].to].v.push_back(a[i].v[j]); 39 a[a[i].to].num++; 40 a[a[i].to].but++; 41 } 42 43 } 44 //print(i); 45 for(int j=1;j<=a[a[i].to].num;j++) 46 if(a[a[i].to].v[j]==a[i].to) 47 printf("%d",ans),exit(0); 48 } 49 for(int i=1;i<=n;i++) 50 a[i].but=0; 51 } 52 return 0; 53 }
正确做法dfs求最小值
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<map> 6 #include<stack> 7 #include<vector> 8 #include<cstdlib> 9 #include<algorithm> 10 #include<queue> 11 using namespace std; 12 const int MAXN=300001; 13 int n,a[MAXN]; 14 int vis[MAXN]; 15 int ans=0x7ffffff; 16 stack<int>s; 17 int dfs(int x) 18 { 19 s.push(x); 20 int num=0; 21 while(!s.empty()) 22 { 23 int te=s.top(); 24 if(!vis[te]) 25 { 26 s.push(a[te]); 27 vis[te]=-1; 28 } 29 else if(vis[te]==-1) 30 { 31 s.pop(); 32 vis[te]=1; 33 num++; 34 while(vis[s.top()]!=1) 35 { 36 vis[s.top()]=1; 37 s.pop(); 38 num++; 39 } 40 s.pop(); 41 while(!s.empty()) 42 { 43 vis[s.top()]=1; 44 s.pop(); 45 } 46 } 47 else if(vis[te]==1) 48 { 49 while(!s.empty()) 50 { 51 vis[s.top()]=1; 52 s.pop(); 53 } 54 } 55 } 56 return num; 57 } 58 int main() 59 { 60 freopen("2015message.in","r",stdin); 61 freopen("2015message.out","w",stdout); 62 scanf("%d",&n); 63 for(int i=1;i<=n;i++) 64 scanf("%d",&a[i]); 65 66 for(int i=1;i<=n;i++) 67 { 68 if(!vis[i]) 69 { 70 int p=dfs(i); 71 if(p!=0) 72 ans=min(ans,p); 73 } 74 } 75 printf("%d",ans); 76 return 0; 77 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:拓扑排序讲解
下一篇:P1156 垃圾陷阱
- 学生信息管理系统.cpp(大二上) 2020-04-23
- 图的连通分量(利用邻接表存储信息) 2020-04-02
- BJFU—214基于链式存储结构的图书信息表的创建和输出 2019-10-08
- Linux下用C++实现 企业信息管理系统 2019-08-29
- 【NOIP2015普及组】 推销员(纪中数据-标准) 2019-08-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash