首先先看题干,这明显是一个有向的图,因为每个戏志才都指向一个角色,换句话来说,也就是他指向的那个角色像他那边有一条路,而考虑到每个戏志才的体力和样例1,我们发现,只有图中出现环的时候,才有可能达到目标,所以问题转换为判断一个有向图中是否有环的问题。

而想要解决这个问题,使用无向图中判断父节点的方式是不对的,必须判断它的临居是否还在栈中,如果在,那说明形成了环,否则不是,所以我们定义三个状态,0表示不在栈中,需要dfs,1表示正在栈中,而2表示已经结束;

代码如下

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
#define all(a) a.begin(), a.end()
#define vi vector<int>
#define vii vector<vector<int>>
vi vis;
vii g ;
bool dfs(int ch )
{
    vis[ch] = 1 ; 
    for(int h : g[ch])
    {
        if(vis[h] == 0)
        {
            if(dfs(h))
            {
                return true ; 
            }
        }
        else if(vis[h] == 1)
        {
            return true ;
        }
    }
    vis[ch] = 2 ; 
    return false ;

}
void work() 
{
    int n , x ; cin >> n >> x; 
    vis.resize(n + 1 , 0);
    g.resize(n + 1);
    for(int i = 1 ; i <= n ; i++)
    {
        int y ; cin >> y; 
        g[y].push_back(i);
    }
    if(dfs(x))
    {
        cout << "Yes" << endl ; 
        return ; 
    }
    cout << "No" << endl; 
    return ; 
}
signed main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t--) 
    {
        work();
    }
    return 0;
}