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提供的建议和帮助。

posted @ 2023-08-06 22:22  very_easy  阅读(19)  评论(0)    收藏  举报  来源