CF285B题解
思路
这题其实很简单,不需要太难的 DFS,只需要模拟就可以了。
我们不妨使每个元素拥有两个属性:是否被访问和当前下标中的数值。
如果当前访问是数字已经被访问过了,就说明产生了循环,直接输出 $-1$ 就可以了,所以代码也就有了。
AC Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{
int val;
bool flag;
}p[N];//val表示值,flag表示是否访问
int main(){
int n,s,t;
cin>>n>>s>>t;
for(int i=1;i<=n;i++){
cin>>p[i].val;
p[i].flag=0;//初始化
}
int cnt=0;//计数
while(1){
if(p[s].flag){//发现循环
cout<<-1;
exit(0);//终止
}
if(s==t){//找到目标
cout<<cnt<<endl;
exit(0);//终止
}
p[s].flag=1;//将当前数设置为访问过了
s=p[s].val;//更新
cnt++;//计数
}
return 0;
}
最后感谢管理员@AK_Dream提供的建议和帮助。

浙公网安备 33010602011771号