题目
求点到环的最短距离+环的大小
分析
由于这道题有点水分,所以说其实暴力就可以解决
代码
#include <cstdio>
#define rr register
using namespace std;
int in[100001],nex[100001],ans[100001],v[100001],n;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (c<48||c>57) c=getchar();
while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
return ans;
}
inline void delet(int x){
v[x]=1;
if (!(--in[nex[x]])) delet(nex[x]);
}
inline signed cir(int x,int dep){
ans[x]=dep;//标记环上点为1
if (ans[nex[x]]) return dep;//有环
else return ans[x]=cir(nex[x],dep+1);//继续找
}
inline signed answ(int x){
if (ans[x]) return ans[x];
else return ans[x]=answ(nex[x])+1;//加上链的答案
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) ++in[nex[i]=iut()];
for (rr int i=1;i<=n;++i) if (!in[i]&&!v[i]) delet(i);//拓扑序找链
for (rr int i=1;i<=n;++i) if (in[i]&&!ans[i]) cir(i,1); //找环
for (rr int i=1;i<=n;++i) if (!in[i]&&!ans[i]) answ(i);//链上求答案
for (rr int i=1;i<=n;++i) print(ans[i]),putchar(10);
return 0;
}