建图跑个bfs就好了= - =
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
vector<int>v[N];
int vis[N],dis[N];
queue<int>q;
void bfs()
{
while(q.size())
{
int temp=q.front();
q.pop();
for(int i=0;i<v[temp].size();i++)
{
int pos=v[temp][i];
if(vis[pos]) continue;
vis[pos]=1;
q.push(pos);
dis[pos]=dis[temp]+1;
// if(pos==6) cout<<temp<<' '<<dis[pos]<<endl;
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
v[i].push_back(x);
}
for(int i=2;i<=n;i++)
{
v[i].push_back(i-1);
v[i-1].push_back(i);
}
q.push(1);
dis[1]=0;vis[1]=1;
bfs();
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}puts("");
return 0;
}
京公网安备 11010502036488号