CF285B Find Marble

题目描述

Petya 和 Vasya 在玩一个游戏。Petya 有 $n$ 个不透明的杯子,这些杯子排成一排。杯子的位置从左到右编号为 $1$ 到 $n$。注意,位置有编号但杯子本身没有编号。 首先,Petya 把一个弹珠放在位置 $s$ 的杯子下。然后,他进行若干次(也可能为零次)洗牌操作。一次洗牌操作意味着把第 $i$ 个位置的杯子移动到位置 $p_i$,即第 $i$ 个位置的杯子去到 $p_i$ 的位置。所有杯子在一次洗牌中是同时移动的。洗牌操作时,弹珠不会从一个杯子转移到另一个杯子,它会随着原来所在的杯子一起移动。 在所有洗牌操作结束后,Petya 向 Vasya 展示弹珠现在位于位置 $t$。Vasya 的任务是说出 Petya 最少做了几次洗牌操作才能让弹珠从位置 $s$ 移动到位置 $t$,或者判断 Petya 是不是搞错了,弹珠根本不可能从 $s$ 移动到 $t$。

输入格式

第一行包含三个整数,$n,s,t\ (1 \leq n \leq 10^{5};\ 1 \leq s,t \leq n)$,分别表示杯子的数量、弹珠的初始位置和目标位置。 第二行包含 $n$ 个空格分隔的整数 $p_1,p_2,...,p_n\ (1 \leq p_i \leq n)$,表示每一次洗牌操作的参数。保证所有 $p_i$ 两两不同。 注意,$s$ 可能等于 $t$。

输出格式

如果弹珠可以从位置 $s$ 移动到位置 $t$,则输出一个非负整数,表示达到目标位置所需的最少洗牌次数。如果不可能,输出 $-1$。

说明/提示

由 ChatGPT 5 翻译