题解- [Noip2015] 信息传递

本文介绍了NOIP2015比赛中关于信息传递的游戏问题,游戏中每个参与者都有一个特定的传递目标,游戏结束条件是某人得知自己的生日。题目要求找出最小的传递环。输入包括人数n和每个参与者的目标编号,保证游戏有确定的结束状态。解决方案是构建有向图并寻找最小环。样例给出了输入和输出示例,解析中提出了利用标记和编号数组来寻找答案的方法。

文章目录

描述

有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号
为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同
时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只
会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一
共可以进行几轮? 简单的说就是给你一个有向图,让你找出一个最小的环来。

输入
输入共2行。
第1行包含1个正整数n表示n个人。 n ≤ 200000
第2行包含n个用空格隔开的正整数T1,T2,……,Tn
其中第i个整数Ti示编号为i的同学的信息传递对象是编号为Ti的同学,Ti≤n且Ti≠i
数据保证游戏一定会结束。

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

样例
输入
5
2 4 2 3 1
输出
3


解析

创建一个环,然后依次将每个人编号存入环中,开一个数组标记,另一个数组储存编号,然后找到结果便结束,找最小的环,便是结果。

#include <bits/stdc++.h>
using namespace std;
const int maxn=200010;
int n, fa[maxn],ans=0x3f3f3f3f;
int get(int x, int &cnt){
    cnt++;
    if(fa[x]==x)return x;
    else return get(fa[x], cnt);
}
int main () {
    cin>>n;
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=n;i++) {
        int 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值