#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1e5+5;
int dfn[maxn];
int low[maxn];
int ans[maxn];
bool ins[maxn];
stack<int> s;
int nxt[maxn];
int color[maxn];
int colornum[maxn];
int colorcnt;
int timing;
void tarjan(int u)
{
timing++;
dfn[u]=low[u]=timing;
s.push(u);
ins[u]=true;
int v=nxt[u];
if(dfn[v]==0)
{
tarjan(v);
low[u]=min(low[v],low[u]);
}else if(ins[v])
{
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
colorcnt++;
while(s.top()!=u)
{
int tmp=s.top();
s.pop();
color[tmp]=colorcnt;
colornum[colorcnt]++;
ins[tmp]=false;
}
s.pop();
color[u]=colorcnt;
colornum[colorcnt]++;
ins[u]=false;
}
}
int findans(int u)
{
if(nxt[u]==u) return ans[u]=1;
if(ans[nxt[u]])
return ans[u]=ans[nxt[u]]+1;
else
return ans[u]=findans(nxt[u])+1;
}
int main()
{
int n;
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>nxt[i];
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0)
tarjan(i);
}
for(int i=1;i<=n;i++)
{
if(colornum[color[i]]>1)
{
ans[i]=colornum[color[i]];
}
}
for(int i=1;i<=n;i++)
{
if(ans[i]==0)
findans(i);
}
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}
tarjan缩点
最新推荐文章于 2019-03-29 12:56:13 发布