首先先看题干,这明显是一个有向的图,因为每个戏志才都指向一个角色,换句话来说,也就是他指向的那个角色像他那边有一条路,而考虑到每个戏志才的体力和样例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;
}

京公网安备 11010502036488号